2016-12-08 11 views
1

Мы установили GCC 6.2.0 вручную на компьютере Scientific Linux. Компиляция приложения C++ кажется хорошо, но мы получаем много undefined references к CXX11 на увязывание времениCXX11 Неопределенные ссылки с GCC 6.2.0

file.cpp:(.text+0x16cb): undefined reference to `std::__cxx11::list<void*, std::allocator<void*> >::list(std::__cxx11::list<void*, std::allocator<void*> > const&)' 

Мы знаем о double ABI issue но компиляции с -D_GLIBCXX_USE_CXX11_ABI=0 не имеют никакого значения. Какие у нас есть другие варианты?

UPDATE

Конфигурация Cmake выглядит следующим образом:

-- The C compiler identification is GNU 6.2.0 
-- The CXX compiler identification is GNU 6.2.0 
-- Check for working C compiler: /opt/GNU/gcc-6.2.0/bin/gcc 
-- Check for working C compiler: /opt/GNU/gcc-6.2.0/bin/gcc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler: /opt/GNU/gcc-6.2.0/bin/g++ 
-- Check for working CXX compiler: /opt/GNU/gcc-6.2.0/bin/g++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 

Это сборник линия file.cpp

gcc-6.2.0/bin/g++ -O3 -fopenmp -DNO_HDF5 -D_GLIBCXX_USE_CXX11_ABI=0 -I./include -I/opt/mpich/3.2/include -o file.cpp.o -c file.cpp 

и связь (где он на самом деле терпит неудачу)

gcc-6.2.0/bin/g++ -O3 -fopenmp -DNO_HDF5 -D_GLIBCXX_USE_CXX11_ABI=0  main.cpp.o -o ASTEP -rdynamic libMainASTEPlib.a -lhdf5_hl -lhdf5 -lz -lm -lhdf5_hl -lhdf5 -lz -lm /opt/mpich/3.2/lib/libmpicxx.so /opt/mpich/3.2/lib/libmpi.so -Wl,-rpath,/opt/mpich/3.2/lib 

Кроме того, MPICH 3,2 был построен новый компилятор (GCC 6.2.0)

+0

* Как * вы связываете свою программу? С 'ld'? С 'gcc'? С 'g ++'? –

+0

Удалите файл объекта и перекомпилируйте. –

+3

При установке gcc gcc предпочитает предполагать, что его библиотеки собираются установить в/usr/lib (64) ?, независимо от того, где вы на самом деле собираете gcc. Таким образом, ваш код оказывается связанным с стандартными библиотеками системы. К сожалению, я забыл детали gory о том, как избить дерьмо из конфигурации gcc, чтобы правильно настроить связь с его библиотеками, где вы их устанавливаете. Вы должны понять это, как я сделал ~ 10 лет назад ... Если бы я вспомнил все это, я бы опубликовал ответ. –

ответ

0

Я не понимаю, почему ваш объект до сих пор ссылки на std::__cxx11::list, когда вы собрали с -D_GLIBCXX_USE_CXX11ABI=0, если макрос не то время переопределено в файле заголовка/источника. Вы должны убедиться, что объект file.o правильно помещается в любой архив, который должен содержать его (и что любая старая версия, безусловно, исчезла). С учетом сказанного:

Возможно, вам понадобится ссылка на библиотеку libstdC++, которая поставляется с gcc 6.2.0, а не с системной версией этой библиотеки, которая, по-видимому, соответствует раннему компилятору.

Для этого может потребоваться использование -nostdlib, а затем вручную добавить -L/(path)/gcc-6.2.0/lib -lstdc++ -lc или аналогичный.

В качестве альтернативы, вы можете скомпилировать с использованием системных заголовков C++, а не заголовков gcc 6.2.0. Затем вы также сможете успешно установить связь с библиотекой libstdC++. В этом случае вы хотите -nostdinc++, а затем -I/usr/include/c++/5 (например). Обратите внимание, что в этом случае -D_GLIBCXX_USE_CXX11_ABI=0 не будет иметь никакого эффекта и не является необходимым; у старой библиотеки нет двойного ABI.

+2

'gcc' ищет' libstdC++ '' 'в своей собственной установке, а не в системном месте (я все время устанавливаю gcc в нестандартные места). –

+0

@ н.м. Однако в этом случае это явно не так. – davmac

+0

Фактически, gcc делает это по умолчанию. В этом случае мы косвенно наблюдаем некоторые неизвестные явления. Это долгий путь отсюда, чтобы четко установить что-либо. До тех пор, пока подробный журнал сборки не будет опубликован. –