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

标签 c++ boost cmake shared static-linking

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

我可以在我的机器上使用我的库,但由于 undefined reference ,我不能在具有不同版本 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?

最佳答案

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

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

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

请注意,对于某些 Boost 库,甚至静态链接也不是一个选项,因为在某些配置中可能需要与共享库链接。您应该查阅您使用的每个 Boost 库的文档,以了解是否存在此类限制。

关于C++ 共享库创建 - 链接到其他共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32955354/

相关文章:

继承类上的 C++ OpenCV mouseCallback

c++ - 模板外的类型名

c++ - 从 Boost.Spirit.Qi 制作shared_ptr

c++ - 如何获得指向 boost::variant 存储的指针?

c++ - Boost.Regex 支持 icu/unicode

c++ - 如何使 C++ 编译器接受 2_147_483.78 作为有效的 float

cmake - 调用 CMake 时如何定义变量,以便 qtcreator 知道它已定义?

cmake - CMake:如何先执行add_custom_command

c++ - soci给出 fatal error :mysql.h:没有这样的文件或目录

c++ - 使用 c 数组的密码