C ++共享库创建 - 链接其他共享库

时间:2015-10-05 18:26:00

标签: c++ boost cmake shared static-linking

我正在创建一个C ++共享库,它链接到一些Boost库(本地机器上的Boost版本1.55)。

我可以在我的机器上使用我的库,但由于未定义的引用,我不能在具有不同版本的Boost的另一个系统上使用它(假设为1.54)。

我正在使用CMake,这里是CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8)
project(my_library)

set(CMAKE_BUILD_TYPE Release)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

FILE(GLOB_RECURSE INCLUDE_FILES "include/*.hpp")
FILE(GLOB_RECURSE SOURCE_FILES "src/*.cpp")

add_library(${PROJECT_NAME} SHARED ${INCLUDE_FILES} ${SOURCE_FILES})

target_link_libraries(${PROJECT_NAME} -pthread -lboost_filesystem -lboost_regex -lboost_system)

我是图书馆创作的新手,我在这个问题上挣扎了好几天。我想知道我是否必须使用Boost创建一个静态库。但我希望我的图书馆尽可能小。

编辑:当我检查我的lib依赖项时,我得到了这个用于Boost正则表达式: libboost_regex.so.1.55.0 => /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.55.0 (0x00007fe228a27000)

是否可以将此更新为针对特定版本的Boost的链接?

2 个答案:

答案 0 :(得分:6)

当您链接到共享库(例如Boost)时,必须在运行时实际加载的库的ABI与编译和链接时使用的库的ABI兼容。 Boost不保持版本之间的ABI兼容性。这就是为什么严格依赖特定的Boost版本。无法构建与其使用的Boost版本无法与版本无关的可执行文件或库。

在Linux世界中,开源代码是正常的,这样就可以为每个Linux发行版单独编译代码。这样,在编译和运行时使用的Boost版本将是相同的 - 发行版维护者发布的版本。

如果开源模型不适合您,您可以自己为不同的Linux发行版构建软件包,也可以尝试以某种方式隐藏依赖项。后者的一种方法是将库构建为共享对象,但与Boost的静态库链接。您必须非常小心,不要在任何公共接口中公开Boost,也不要从库中导出任何Boost符号。这包括类型信息,因此不能从库中抛出Boost异常。基本上,您使用Boost的事实必须对您的图书馆用户完全隐藏。否则,很难解决Boost和Boost之间可能被库用户使用的冲突。

请注意,对于某些Boost库,即使是静态链接也不是一个选项,因为在某些配置中可能需要链接共享库。您应该参考用于查看是否存在此类约束的每个Boost库的文档。

答案 1 :(得分:0)

您不应该创建静态库,因为它只是目标文件的存档。静态库也不是由编译器创建的,它是使用拱形工具创建的

html, body {
  overflow-x: hidden;
  overflow-y: hidden;
}

相反,编译器支持共享库。

ar cr libtemp.a obj/*.o

您可以使用“nm”,“ldd”和“objdump”等工具检查您的库中的符号。

阅读链接器和加载器,它将更好地了解这个主题。

CMAKE的标准做法是使用find_package而不是喜欢directlty。

g++ -fPIC -shared *.o -o libtemp.so