由于依赖关系,应用程序链接同一库的 2 个版本

Application linking 2 versions of same library due to dependencies

我的应用程序在 Linux 上动态 linking 库 (libpng) 时遇到问题。

我使用的libpng版本是libpng15。由于我的应用程序还 linking DI-GUY,即 linking libpng3,因此这两个版本会发生冲突。使用 "clash" 我的意思是 linker (ldd) 选择 libpng3 而不是 libpng15。

如果我查看 ldd 输出,则会列出 libpng15 和 libpng3。顺序如下:

    libpng.so.3 => ../lib/libpng.so.3 (0x00007f4bccdff000)
    libpng15.so.15 => ../lib/libpng15.so.15 (0x00007f4bc5d1b000)

在 CMake 中,我确保我 link 专门针对 15:

add_library(PNG::Shared SHARED IMPORTED)
    set_target_properties(PNG::Shared PROPERTIES
    IMPORTED_LOCATION ${_IMPORT_PREFIX}/lib/libpng15.so.15.4.0
    INTERFACE_INCLUDE_DIRECTORIES ${_IMPORT_PREFIX}/include
    INTERFACE_LINK_LIBRARIES z
)

根据我的理解,该应用程序应该使用 libpng15,但是由于 libpng.so.3 在 ldd 中比 15 版本更靠前,因此 linker 选择 libpng.so。 3 代替。

我怎样才能强制我的应用程序使用 libpng15.so.15,DI-GUY 库将使用 libpng.so.3。由于我无法重新编译 DI-GUY,我坚持 libpng.so.3 也被 linked,但它不应该与 15 版本混淆...

我不明白的是为什么 libpng.so.3 甚至被考虑,因为我明确 link 反对 libpng15.so.15.4.0

正确的解决方案是创建库,即 linking libpng3,link 它处于私有模式:

target_link_libraries(${TARGET} PUBLIC 
    VigFramework
    PedestriansBDI_Base
    DIGUY::GraphicsApi
    DIGUY::Main
    DIGUYDevil::Main
    TBB::Main2
    Qt4::QtCore
    Qt4::QtSql
    Qt4::QtGui
    Qt4::QtXml
    Qt4::QtNetwork
    Tiff::Main
)

target_link_libraries(${TARGET} PRIVATE 
    PNG3::Shared #required for DIGUY
)

这将保证主应用程序 link 使用 libpng15 并且不会被来自其他库的 libpng3 污染。