c++共享库的创建-与其他共享库的链接
C++ Shared library creation - linking against other shared libraries
我正在创建一个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里面。但是我希望我的库尽可能的小。
编辑:当我检查我的库依赖时,我得到了Boost regex:libboost_regex.so.1.55.0 => /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.55.0 (0x00007fe228a27000)
是否可以将此更新为NOT链接针对特定版本的Boost?
当您链接到共享库(例如Boost)时,在运行时实际加载的库的ABI必须与编译和链接时使用的ABI兼容。Boost在不同版本之间不维护ABI兼容性。这就是为什么严格依赖于特定Boost版本的原因。没有办法构建一个与Boost版本无关的可执行文件或库。
在Linux世界中,开放源代码代码是正常的,这样它就可以为每个Linux发行版单独编译。这样,在编译和运行时使用的Boost版本将是相同的——发行版维护者提供的版本。
如果开源模型不适合您,您可以自己为不同的Linux发行版构建包,或者尝试以某种方式隐藏依赖项。实现后者的一种方法是将库构建为共享对象,但与Boost的静态库链接。但是,您必须非常小心,不要在任何公共接口中暴露Boost,也不要从库中导出任何Boost符号。这包括类型信息,因此不能从库中抛出Boost异常。基本上,您正在使用Boost的事实必须对库用户绝对隐藏。否则,将很难解决您的Boost与您的库用户可能使用的Boost之间的冲突。
注意,对于一些Boost库,甚至静态链接都不是一个选项,因为在某些配置中可能需要链接共享库。您应该查阅您使用的每个Boost库的文档,看看是否存在这样的约束。
您不应该创建静态库,因为它只是对象文件的存档。此外,静态库不是由编译器创建的,而是使用拱形工具创建的
ar cr libtemp.a obj/*.o
相反,编译器支持共享库。
g++ -fPIC -shared *.o -o libtemp.so
你可以使用像"nm", "ldd"answers"objdump"这样的工具来检查你的库中的符号。
阅读链接器和加载器,它会让你对这个主题有更好的理解。
CMAKE的另一个标准做法是使用find_package而不是直接使用like。
find_package (Threads)
find_package(Boost,file_system,regex,system)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT} ${BOOST_LIBS})
- 使用 pybind11 构建库,链接其他共享库
- 如何使 extern 方法在共享库中定义,但使用 cmake 在其他目标中声明?
- 如何与其他开发人员共享代码?(和命名)
- 重载流<<运算符,用于指针/共享指针和其他类型的
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- 您如何共享Java功能而不提供其他源代码
- 如何从实现与其他接口共享的接口的类继承
- 共享库依赖于具有硬编码路径的其他库
- 在C 中,可以从第三个共享对象访问其他两个不同共享对象
- 删除与其他类共享的指针
- 创建一个取决于其他共享对象的共享对象
- buildroot:仅构建一个包裹作为共享和静态lib,所有其他包装仅共享
- 创建包含其他库的共享库
- 如何与其他应用程序共享 HGLOBAL?
- 在Android中,如何在jni_onLoad方法中加载其他共享库
- Eigen3 或其他矩阵库 2D 矩阵是否可以通过共享内存从不同的进程更新
- 如何在Ruby和其他语言之间共享文本文件(或互斥/信号量)
- 建立链接到其他非标准共享库的共享库
- 如果我删除其他进程的共享内存,会发生什么
- Linux,共享库使用主程序中的函数,而不是其他共享库