【发布时间】:2019-03-15 14:25:55
【问题描述】:
尝试在 Ubuntu (16.04) 上使用 CMake 编译共享库并将其链接到在 CentOS (6.8) 上使用 CMake 编译的可执行文件时,我遇到了一些问题。
创建库的第一个 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 上编译第二部分时,对于在 C++11 中定义且未在 C++98 标准中定义的每个函数,都会抛出 undefined reference。事实上,这最初是我这样做的原因:使用更新版本的 g++ 构建库(包含 C++11),并将其链接到 CentOS 上的可执行文件,其中旧版本不支持标准, 可用(我在 CentOS 上没有 root 访问权限)。
我想知道我正在尝试做的事情是否可能,如果是,我错过了什么。
编辑 在 Matthieu Brucher 的回答之后,除了 -std=c++11 标志之外,我还在第一个 CMakeLists.txt 文件中添加了标志 -D_GLIBCXX_USE_CXX11_ABI=0。这删除了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'
【问题讨论】: