配置 CMake 以遵循符号链接
Configure CMake to follow symlink
在Linux中,考虑有test.so个文件。它在 运行 期间需要其他 .so(例如 alpha.so、beta.so、charlie.so)文件。它基本上是一个共享库。当我 运行 在终端中执行以下命令时:
$ ldd test.so
显示了以下输出:
alpha.1.4.so ==> usr/lib/x86-linux-gnu/alpha.1.4.so
beta.1.4.so ==> usr/lib/x86-linux-gnu/beta.1.4.so
charlie.1.4.so ==> usr/lib/x86-linux-gnu/charlie.1.4.so
我想修改用于构建 test.so 的 cmake 以指向符号链接,像这样
alpha.so ==> usr/lib/x86-linux-gnu/alpha.1.4.so
beta.so ==> usr/lib/x86-linux-gnu/beta.1.4.so
charlie.so ==> usr/lib/x86-linux-gnu/charlie.1.4.so
而不是将其链接到该库的特定版本(alpha.1.4.so
、beta1.4.so
、charlie.1.4.so
)。
如何修改我的 CMake 配置以使 test.so 文件遵循符号链接而不是特定版本?我基本上想让它独立于版本。
要在库链接中禁用 soname 部分,请设置 NO_SONAME 属性:
set_target_properties(<library-target> PROPERTIES NO_SONAME OFF)
您可以对在您的项目中创建的每个库目标使用此命令,或者通过列出所有应该应用它的目标来使用它一次:
# Collect all library targets somehow
set(LIBRARY_TARGETS <library-target1> <library-target2> ...)
# And set the property for all of them
set_target_properties(${LIBRARY_TARGETS} PROPERTIES NO_SONAME OFF)
他们说有CMAKE_SHARED_LIBRARY_SONAME_C_FLAG变量,影响所有目标。但似乎这个变量只在工具链脚本中起作用,在它们之后不起作用。
@Tsyvarev 的解决方案适用于 SO_NAME 不包含版本的动态库。
但在我的例子中,.so
文件的 SO_NAME 包含其中的版本号。虽然不建议在 SO_NAME 中使用版本号,但某些库会这样做。我在 linux.
中使用 patchelf 命令修改了 .so
文件
patchelf --set-soname dynamic_lib.so dynamic_lib.so.version_number
这将更改库的 SO_NAME。
在Linux中,考虑有test.so个文件。它在 运行 期间需要其他 .so(例如 alpha.so、beta.so、charlie.so)文件。它基本上是一个共享库。当我 运行 在终端中执行以下命令时:
$ ldd test.so
显示了以下输出:
alpha.1.4.so ==> usr/lib/x86-linux-gnu/alpha.1.4.so
beta.1.4.so ==> usr/lib/x86-linux-gnu/beta.1.4.so
charlie.1.4.so ==> usr/lib/x86-linux-gnu/charlie.1.4.so
我想修改用于构建 test.so 的 cmake 以指向符号链接,像这样
alpha.so ==> usr/lib/x86-linux-gnu/alpha.1.4.so
beta.so ==> usr/lib/x86-linux-gnu/beta.1.4.so
charlie.so ==> usr/lib/x86-linux-gnu/charlie.1.4.so
而不是将其链接到该库的特定版本(alpha.1.4.so
、beta1.4.so
、charlie.1.4.so
)。
如何修改我的 CMake 配置以使 test.so 文件遵循符号链接而不是特定版本?我基本上想让它独立于版本。
要在库链接中禁用 soname 部分,请设置 NO_SONAME 属性:
set_target_properties(<library-target> PROPERTIES NO_SONAME OFF)
您可以对在您的项目中创建的每个库目标使用此命令,或者通过列出所有应该应用它的目标来使用它一次:
# Collect all library targets somehow
set(LIBRARY_TARGETS <library-target1> <library-target2> ...)
# And set the property for all of them
set_target_properties(${LIBRARY_TARGETS} PROPERTIES NO_SONAME OFF)
他们说有CMAKE_SHARED_LIBRARY_SONAME_C_FLAG变量,影响所有目标。但似乎这个变量只在工具链脚本中起作用,在它们之后不起作用。
@Tsyvarev 的解决方案适用于 SO_NAME 不包含版本的动态库。
但在我的例子中,.so
文件的 SO_NAME 包含其中的版本号。虽然不建议在 SO_NAME 中使用版本号,但某些库会这样做。我在 linux.
.so
文件
patchelf --set-soname dynamic_lib.so dynamic_lib.so.version_number
这将更改库的 SO_NAME。