我在我的应用程序在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
答案 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选项要求版本完全匹配。