【问题标题】:CMake Library Linking using two different compiler versions使用两个不同编译器版本的 CMake 库链接
【发布时间】: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'

【问题讨论】:

    标签: c++ c++11 cmake


    【解决方案1】:

    这样做的主要问题是c++11版本有不同的abi。如果你想用旧的abi编译c++11,添加宏_GLIBCXX_USE_CXX11_ABI=0

    然后应该解决未定义的引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      相关资源
      最近更新 更多