Связывание библиотеки CMake с использованием двух разных версий компилятора - PullRequest
0 голосов
/ 10 октября 2018

У меня возникают некоторые проблемы при попытке скомпилировать общую библиотеку с использованием CMake в Ubuntu (16.04) и связать ее с исполняемым файлом, скомпилированным с CMake в CentOS (6.8).

Первый CMakeLists.txt, который нужно создатьбиблиотека выглядит так:

cmake_minimum_required(VERSION 3.0)

project(MyLibrary)

file(GLOB ${SOURCES} SOURCES "src/*.cpp")
include_directories(${PROJECT_SRC_DIR}/include)
set(CMAKE_CXX_FLAGS "-std=c++11")

add_library(${PROJECT_NAME} SHARED ${SOURCES})

, которая создаст libMyLibrary.so

Второй файл CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)

project(MyApp)

set(MY_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../build)
include_directories(${MY_LIB_DIR}/include)
set(CMAKE_CXX_FLAGS "-std=c++98")

add_executable(${PROJECT_NAME} "main.cpp")
target_link_libraries(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/../build/libMyLibrary.so)

Обратите внимание, что библиотека была встроена вКаталог build, а конечный исполняемый файл MyApp находится в другой папке.В Ubuntu эта комбинация работает, создавая библиотеку в Ubuntu и компилируя только вторую часть в CentOS, выбрасывает undefined reference для каждой функции, определенной в C ++ 11 и не определенной в стандарте C ++ 98.Фактически, это было изначально причиной, почему я сделал это: собрать библиотеку (содержащую C ++ 11) с более поздней версией g ++ и связать ее с исполняемым файлом на CentOS, где более старая версия, не поддерживающая стандарт, доступно (у меня нет доступа с правами root на CentOS).

Я хотел бы знать, возможно ли то, что я пытаюсь сделать, и, если да, то, что мне не хватает.

РЕДАКТИРОВАТЬ После ответа МатьеБрухер, я добавил флаг -D_GLIBCXX_USE_CXX11_ABI=0 в первый файл CMakeLists.txt, в дополнение к флагу -std=c++11.Это убрало undefined reference ошибок, но все еще сохраняет следующее:

undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::basic_string<char,std::char_traits<char>,std::allocator<char> >&&)@GLIBCXX_3.4.14'
undefined reference to `std::basic_ios<char, std::char_traits<char>>::operator bool() const@GLIBCXX_3.4.21'
undefined reference to `std::random_device::_M_getval()@GLIBCXX_3.4.18'
undefined reference to `std::random_device::_M_fini()@GLIBCXX_3.4.18'
undefined reference to `std::random_device::_M_init(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@GLIBCXX_3.4.18'

1 Ответ

0 голосов
/ 10 октября 2018

Основная проблема в том, что версия c ++ 11 имеет другой abi.Если вы хотите скомпилировать c ++ 11 со старым abi, добавьте макрос _GLIBCXX_USE_CXX11_ABI=0.

Тогда неопределенные ссылки должны быть решены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...