【问题标题】:C++/CMake installable libraries with conflicting .so names.so 名称冲突的 C++/CMake 可安装库
【发布时间】:2021-09-13 21:40:21
【问题描述】:

我在 linux 系统上安装的 c++ 包中的库名称冲突时遇到问题。这两个包都使用 cpack 内置到可安装的 apt 包中。安装了两个软件包(A 和 B)。 请注意,虽然我可以控制这些包,因此我可以更改 CMake 等,但它们将被编译成 debian 包并作为系统库安装,而不是安装在 /usr/local/ 下。

每个包都有自己的utils 模块。 每个模块都安装了父项目的命名空间(所以A::utils和B::utils),库.so文件位于项目名称的子文件夹中,而不是直接在/usr/lib中 - 所以/usr/lib/A/libutils.so和/usr/lib/B/libutils.so .

作为安装后脚本,将带有项目名称(A 或 B)的文件添加到包含已安装库的路径(例如 /usr/lib/A)到库路径的 /etc/ld.so.conf.d .

除了utils项目A还有一个库foo,它依赖于A::utils

我有第三个项目C,它有一个依赖于A::foo 的可执行文件,但是(据我所知)不根本没有使用B。

在构建 C 时遇到错误,指出存在未定义的引用。通过进一步调查,我确定当C 构建并且A::foo 必须解析utils 时,它会发现B::utils 而不是A::utils 导致错误。我希望得到一些解释为什么会发生这种情况/如何解决它?我的理解是命名空间(除了将库放在子文件夹中以使文件本身不会冲突)将解决库命名冲突的问题。

以下是其中一个 CMakeLists 的安装部分的示例

set(PROJECT_NAME A)
set(component utils)

add_library(${component} SHARED
        src/UtilsExample.cpp
        )
add_library(${PROJECT_NAME}::${component} ALIAS ${component})
#... stuff with the libraries and whatnot
install(TARGETS ${component} EXPORT ${component}Targets
  COMPONENT ${component}
  LIBRARY DESTINATION lib/${PROJECT_NAME}
  ARCHIVE DESTINATION lib/${PROJECT_NAME}
  RUNTIME DESTINATION bin
  )
install(EXPORT ${component}Targets
  FILE "${PROJECT_NAME}-${component}Targets.cmake"
  NAMESPACE ${PROJECT_NAME}::
  DESTINATION lib/cmake/${PROJECT_NAME}
  COMPONENT ${component}
  )

为确保库名称是唯一的,我是否需要在项目名称之前加上类似的名称?所以图书馆会被命名为A_utils?这似乎会使外部项目的别名变得很奇怪,A::A_utils

【问题讨论】:

    标签: c++ linux cmake apt


    【解决方案1】:

    Linux 动态库解析纯粹是通过所需库的名称。检查所有搜索路径,直到找到匹配的文件名,因此您不能有重复的 .so 文件名。

    但是,实际上只有库文件名必须是唯一的。您可以为所有内部目的保留 CMake 命名空间名称,只需将输出文件名设置为 A_utils:

    set_target_properties(A::utils PROPERTIES LIBRARY_OUTPUT_NAME A_utils)
    

    在整个项目中继续将A::utils 用于target_link_libraries() 和类似名称。

    【讨论】:

    • 太棒了!感谢您的建议/解释。 project 调用之后的 cmake set(CMAKE_SHARED_LIBRARY_PREFIX "lib${PROJECT_NAME}") 之类的内容对于为整个项目中的所有共享库目标设置此前缀是否有意义,或者这是否会引入一些我不知道的额外危险?
    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    相关资源
    最近更新 更多