使用两个不同的编译器版本的CMake库链接

时间:2018-10-10 15:52:05

标签: c++ c++11 cmake

当尝试在Ubuntu(16.04)上使用CMake编译共享库并将其链接到在CentOS(6.8)上使用CMake编译的可执行文件时,我遇到了一些问题。

第一个创建库的CMakeLists.txt如下:

object item = items[i];
AppointmentItem appointmentItem = item as AppointmentItem;
...
Marshal.ReleaseComObject(appointmentItem);
Marshal.ReleaseComObject(item);

这将创建libMyLibrary.so

第二个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})

请注意,该库是在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是在另一个文件夹中构建的。在Ubuntu上,这种组合有效,而在Ubuntu上生成库并在CentOS上仅编译第二部分时,对于C ++ 11中定义的和C ++ 98标准中未定义的每个函数,都抛出MyApp。实际上,这最初就是我这样做的原因:使用较新版本的g ++构建该库(包含C ++ 11),并将其链接到CentOS上的可执行文件,其中的旧版本不支持该标准。可用(我在CentOS上没有root访问权限)。

我想知道我想做的事是否可能,如果可以,我想念的是什么。

编辑,在回答Matthieu Brucher之后,除了undefined reference标志之外,我还向第一个CMakeLists.txt文件添加了标志-D_GLIBCXX_USE_CXX11_ABI=0。这消除了-std=c++11错误,但stil保留以下内容:

undefined reference

1 个答案:

答案 0 :(得分:0)

与此相关的主要问题是c ++ 11版本具有不同的abi。如果要使用旧abi编译c ++ 11,请添加宏_GLIBCXX_USE_CXX11_ABI=0

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