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

时间:2019-06-14 08:41:22

标签: cmake libpng ldd

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

我正在使用的libpng版本是libpng15。由于我的应用程序还链接了DI-GUY(链接了libpng3),因此这两个版本存在冲突。 “冲突”是指链接器(ldd)选择libpng3而不是libpng15。

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

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

在CMake中,我确保我明确针对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版本更远,因此链接程序改为选择libpng.so.3。

如何强制我的应用程序使用libpng15.so.15,而DI-GUY lib将使用libpng.so.3。由于我无法重新编译DI-GUY,因此我也停留在libpng.so.3也被链接的情况,但不要与15版本混淆...

我不明白的是为什么甚至考虑libpng.so.3,因为我明确链接到libpng15.so.15.4.0

2 个答案:

答案 0 :(得分:0)

正确的解决方案是使链接libpng3的库以私有模式链接:

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
)

这将确保主应用程序与libpng15链接,并且不会被其他库中的libpng3污染。

答案 1 :(得分:-1)

您应该使用find_package查找该库的特定版本:

find_package(<package> [version] [EXACT] ...)

文档说:

  

[version]参​​数请求找到软件包的版本   应该兼容(格式为major [.minor [.patch [.tweak]]])。的   EXACT选项要求版本完全匹配。