当尝试在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
答案 0 :(得分:0)
与此相关的主要问题是c ++ 11版本具有不同的abi。如果要使用旧abi编译c ++ 11,请添加宏_GLIBCXX_USE_CXX11_ABI=0
。
然后应解决未定义的引用。