Компиляция кода C ++ в Linux. Необходимо использовать gcc / 4.7.2. Не могу найти стандартные библиотеки

Я немного новичок в том, что касается ошибок компиляции / компоновки.

Я работаю с большим кодом C ++ (есть также несколько файлов C). Я успешно запустил его на Mac, скомпилированный с g ++. Теперь мне нужно запустить его в кластере на базе Linux, потому что он слишком медленный на моем Mac. Код состоит из нескольких библиотек, которые мне нужно скомпилировать, а также моего собственного кода, который использует эти библиотеки.

Я могу скомпилировать весь код кластера с помощью компилятора g ++ по умолчанию. Однако, к сожалению, я обнаружил, что мне нужно скомпилировать с помощью gcc / 4.7.2, чтобы код работал с другим программным обеспечением в кластере. Я работал над ошибками компиляции и компоновки. До сих пор все они были связаны с проблемами C ++ по сравнению с C. Например, мне пришлось добавить «extern» в некоторые файлы C. Мне пришлось изменить заголовки с C ++ на C.

Моя проблема, похоже, связана с одной конкретной библиотекой (я успешно справился со всеми остальными). Он компилируется в своем каталоге. Но когда я перехожу в свой рабочий каталог, я получаю всевозможные ошибки, которые кажутся связанными с кодом, составляющим эту библиотеку проблем. Я предполагаю, что они в основном связаны с отсутствием стандартных библиотек. Я просто не понимаю, в чем проблема с моими включениями, и был бы очень признателен, если бы кто-нибудь мог взглянуть на то, что у меня есть в моем make-файле для этой библиотеки. Эта библиотека официально основана на "C ++", но, похоже, в ее файлах содержится много кода в стиле C.

Слишком много ошибок (страниц) и слишком много кода для публикации всего. Я надеюсь, что того, что я опубликовал, достаточно, и я могу дополнить его, если это поможет. Я не могу точно определить, откуда они берутся в моем коде, потому что они очень загадочные; Например:

Code.cpp :(. Text + 0x35): неопределенная ссылка на `std :: cout '

Параметры моего make-файла и компилятора приведены ниже. Первоначально я создал это на своем Mac с помощью QT. Я модифицировал его для работы с кластером Linux на gcc / 4.7.2. Так что вполне возможно, что это немного беспорядок.

Сначала я делаю (командная строка в терминале):

загрузка модуля gcc / 4.7.2

Тогда make-файл:

CC = gcc

DEFINES = -DIPMGEMPLUGIN -DNOPARTICLEARRAY -D__unix

CFLAGS = -c -g -O2 -pedantic -fno-nonansi-builtins -D__unix -m64

CXXFLAGS = -pipe -O2 -Wall -W -fPIC $ (DEFINES) -lstdc ++ -m64

INCPATH = -I. \

             -I/mounts/apps/gcc/4.7.2/ \

             -I/mounts/apps/gcc/4.7.2/bin/ \

             -I/mounts/apps/gcc/4.7.2/bin/x86_64-unknown-linux-gnu/4.7.2 \

             -I/mounts/apps/gcc/4.7.2/lib64 \

             -I/mounts/apps/gcc/4.7.2/bin/include \

             -I/mounts/apps/gcc/4.7.2/bin/include/c++ \

             -I/mounts/apps/gcc/4.7.2/4.7.2/bin/include/c++/4.7.2 \

AR = ar cq RANLIB = ranlib -s TARGET = mylib.a

. СУФФИКСЫ: .o .c .cpp .cc .cxx .C

.cpp.o: $ (CC) -c $ (CXXFLAGS) $ (INCPATH) -o "$ @" "$‹ "

.cc.o: $ (CC) -c $ (CXXFLAGS) $ (INCPATH) -o "$ @" "$‹ "

.cxx.o: $ (CC) -c $ (CXXFLAGS) $ (INCPATH) -o "$ @" "$‹ "

.C.o: $ (CC) -c $ (CXXFLAGS) $ (INCPATH) -o "$ @" "$‹ "

.c.o: $ (CC) -c $ (CFLAGS) $ (INCPATH) -o "$ @" "$‹ "

Теперь о типах ошибок, которые я получаю:

Code.o: в функции _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc.part.8': Code.cpp:(.text+0x12): undefined reference tostd :: basic_ios> :: clear (std :: _ Ios_Iostate) 'Code.o: в функции _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc.constprop.101': Code.cpp:(.text+0x35): undefined reference tostd :: cout' Code.cpp :(. Text + 0x3a): неопределенная ссылка на `std :: basic_ostream> & std :: __ ostream_insert

(std :: basic_ostream> &, char const *, long) 'Code.cpp :(. text + 0x3f): неопределенная ссылка на std::cout' Code.cpp:(.text+0x49): undefined reference tostd :: cout' Code.cpp :(. text + 0x53): неопределенная ссылка на std::cout' Code.o: In function _ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcpen13_Ios. constprop.99 ': Code.cpp :(. text + 0x93): неопределенная ссылка на std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)' Code.o: In function _ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode.constprop.96': Code.cpp :(. text + 0x103): неопределенная таблица для std::ios_base::ios_base()' Code.cpp:(.text+0x10b): undefined reference tov :(. text + 0x11b): undefined ссылка на VTT for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >' Code.cpp:(.text+0x15d): undefined reference to std :: basic_iostream> :: basic_iostream () 'Code.cpp :(. text + 0x16c): undefined ссылка на vtable for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >' Code.cpp:(.text+0x174): undefined reference to vtable для std :: basic_stringstream, std :: allocator>' Код .cpp :(. text + 0x17c): неопределенная ссылка на vtable for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >' Code.cpp:(.text+0x184): undefined reference to vtable для std :: basic_streambuf> '

И далее:

gl3.cpp :(. text + 0x18d): неопределенная ссылка на `operator new [] (unsigned long) '

gl3.cpp :(. text + 0x1a1): неопределенная ссылка на `operator new [] (unsigned long) '

gl3.cpp :(. text + 0x1b5): неопределенная ссылка на `operator new [] (unsigned long) '

gl3.cpp :(. text + 0x1c9): неопределенная ссылка на `operator new [] (unsigned long) '

gl3.cpp :(. text + 0x1dd): неопределенная ссылка на `operator new [] (unsigned long) '

/data/place/number/account/CodeDirectory/../ProblemLibraryDirectory/libProblem.a(gl3.o): В функции Other::free_internal()': gl3.cpp:(.text+0x251): undefined reference tooperator удалите 'gl3.cpp :(. text + 0x262): ...

Это что-нибудь значит для кого-нибудь?


person Ant    schedule 20.07.2013    source источник
comment
Вы говорите, что он компилируется. Но когда я перехожу в свой рабочий каталог, я получаю всевозможные ошибки. Но затем вы показываете ошибку компиляции, Code.cpp :(. Text + 0x35): undefined ссылка на `std :: cout 'Вы уверены, что используете #included ‹iostream› в Code.cpp?   -  person doctorlove    schedule 20.07.2013
comment
Спасибо за ответ, доктор, любимый. Я имею в виду, что все библиотеки компилируются в своих каталогах. Когда я перехожу в свой рабочий каталог (который использует библиотеки), компиляция не выполняется. Я проверил code.cpp, и там есть #include ‹iostream›. Кажется, что все ошибки возвращаются в библиотеку проблем. Выше (последний текст на сером фоне) gl3.cpp (и другие файлы .cpp в другом выводе ошибок, который я не показал, потому что он слишком длинный) находятся в библиотеке проблем.   -  person Ant    schedule 20.07.2013
comment
Если вы используете g ++ вместо gcc, этого, вероятно, не произойдет. Компилятор gcc должен быть связан со стандартными библиотеками C ++, но при использовании g ++ они связываются автоматически. Также я бы предложил использовать CMake вместо make.   -  person Kourosh    schedule 20.07.2013
comment
Спасибо, Курош. Да, у меня нет проблем при компиляции с использованием g ++, но, к сожалению, я должен использовать gcc. Чтобы использовать CMake, могу ли я просто набрать CMake вместо make? Мне нужно ненадолго оставить свой компьютер, но вернусь через несколько часов.   -  person Ant    schedule 20.07.2013
comment
@Ant: CMake использует make-файлы совершенно другого стиля. Для проекта вашего размера я далеко не уверен, что CMake имеет больше смысла, чем Make.   -  person Mats Petersson    schedule 20.07.2013
comment
Большое спасибо, Матс. Я бы предпочел использовать метод, который требует как можно меньше изменений, потому что этот код огромен !!   -  person Ant    schedule 20.07.2013
comment
@ Не знаете, что вы имеете в виду, говоря, что вам нужно использовать gcc для компиляции?   -  person Jakob Kroeker    schedule 22.07.2013
comment
Привет, Якоб, в кластере мне сказали, что системная версия g ++ не использует соответствующую версию openmp. Я действительно хотел бы использовать g ++, потому что он отлично работает.   -  person Ant    schedule 22.07.2013


Ответы (1)


Вы используете функции C ++, такие как функции new и std::*, поэтому вы должны компилировать с помощью компилятора C ++ (если вы не связываете скомпилированную версию C с библиотеками C ++). GCC - это компилятор C, а G ++ - компилятор GNU C ++, поэтому вам следует использовать G ++.

В одном из ваших комментариев я видел, что по какой-то причине вам пришлось использовать GCC. В этом случае вам придется удалить весь код, специфичный для C ++, из вашей программы (например, std::* и _4 _ / _ 5_) или связать его с библиотеками C ++. Однако я не вижу причин, по которым вам следует использовать GCC. Пожалуйста, объясните, почему вы должны использовать GCC, тогда мы сможем вам помочь.

person Skux Deluxe    schedule 28.07.2013