У меня возникают некоторые проблемы при попытке скомпилировать общую библиотеку с использованием 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'