GCC неопределенные ссылки с abi: cxx11 - PullRequest
0 голосов
/ 28 марта 2019

Я собираю программы на C ++ с помощью gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11). Все хорошо во время компиляции.

Затем я связываю эти программы с библиотекой, созданной с помощью gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3).

Затем я получаю неопределенные ошибки ссылки:

CMakeFiles/FOSSSim.dir/RigidBodies/RigidBodyGRVelocityProjectionCollisionResolver.cpp.o:(.rodata._ZTV46RigidBodyGRVelocityProjectionCollisionResolver[_ZTV46RigidBodyGRVelocityProjectionCollisionResolver]+0x18): undefined reference to `RigidBodyGRVelocityProjectionCollisionResolver::getName[abi:cxx11]() const'
CMakeFiles/FOSSSim.dir/RigidBodies/RigidBodyGRLCPCollisionResolver.cpp.o:(.rodata._ZTV31RigidBodyGRLCPCollisionResolver[_ZTV31RigidBodyGRLCPCollisionResolver]+0x18): undefined reference to `RigidBodyGRLCPCollisionResolver::getName[abi:cxx11]() const'
CMakeFiles/FOSSSim.dir/RigidBodies/RigidBodyVelocityProjectionCollisionResolver.cpp.o:(.rodata._ZTV44RigidBodyVelocityProjectionCollisionResolver[_ZTV44RigidBodyVelocityProjectionCollisionResolver]+0x18): undefined reference to `RigidBodyVelocityProjectionCollisionResolver::getName[abi:cxx11]() const'
CMakeFiles/FOSSSim.dir/RigidBodies/RigidBodyLCPCollisionResolver.cpp.o:(.rodata._ZTV29RigidBodyLCPCollisionResolver[_ZTV29RigidBodyLCPCollisionResolver]+0x18): undefined reference to `RigidBodyLCPCollisionResolver::getName[abi:cxx11]() const'
CMakeFiles/FOSSSim.dir/RigidBodies/RigidBodyAllPairsCollisionDetector.cpp.o:(.rodata._ZTV34RigidBodyAllPairsCollisionDetector[_ZTV34RigidBodyAllPairsCollisionDetector]+0x18): undefined reference to `RigidBodyAllPairsCollisionDetector::getName[abi:cxx11]() const'

При некотором поиске я обнаружил несколько ссылок, таких как linking problem -ПУБЛИКИ ДЛЯ СИМВОЛОВ-С-abicxx11 , касающихся опции компиляции -D_GLIBCXX_USE_CXX11_ABI=0. К сожалению, когда я использую эту опцию, я получаю предупреждение Cmake:

CMake Warning:
  Manually-specified variables were not used by the project:

    _GLIBCXX_USE_CXX11_ABI

Есть какие-нибудь подсказки на пути решения проблемы? Зная, что я бы предпочел не менять версию компилятора.

Спасибо.

1 Ответ

1 голос
/ 29 марта 2019

_GLIBCXX_USE_CXX11_ABI - это макрос препроцессора, который управляет поведением реализации стандартной библиотеки GNU C ++.Его нужно передать препроцессору, а не CMake.

Использовать add_compile_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) в вашем CMakeLists.txt или передать его через CMAKE_CXX_FLAGS в командной строке:

cmake -DCMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' path/to/your/project

Обратите внимание, что пока этоможет заставить вашу программу собираться, вероятно, этого будет недостаточно, чтобы все работало.Смешивание объектного кода, скомпилированного различными версиями GCC, чревато проблемами.

...