Linux C++与两个版本的静态库链接

yqlxgs2m  于 2023-01-04  发布在  Linux
关注(0)|答案(1)|浏览(145)

我正在构建一个python扩展库,不幸的是,我不得不使用不同版本的静态库(libtiff),为了避免绑定冲突,我将对不同版本静态库的所有调用分隔在不同的共享“so”库中。x1c 0d1x
我使用fvisibility“hidden”标志编译“so”库,以隐藏静态库版本的实现。不幸的是,它不起作用。我的进程崩溃,因为A.so调用了C(2). a中的一些函数。我尝试设置env变量LD_BIND_NOW以减少惰性绑定效果。它没有帮助。
我使用的是CentOS-7cmakegccv. 10.2.1,ldv. 2.35-5.el7.4有什么方法可以隔离静态库吗?如有任何意见,我们将不胜感激。
它在Windows上运行完美。在OSX和最新版本的Ubuntu上看起来还可以。不幸的是,我必须用基于CentOS-7的“ManyLinux”Linux构建库,才能在不同的Linux平台上分发我的Python库。

hts6caw3

hts6caw31#

我以为将库的fvisibility标志设置为hidden不仅会隐藏库类/函数,还会隐藏子库的类/函数。这是错误的。该标志对子库没有影响。它们对链接器仍然可见。幸运的是,有一个标志只隐藏子库API。在CMake文件中,看起来是这样的

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs,${LIB}")
    set(HIDE_PRIVATE_SYMBOLS ON)
endif()

相关问题