由于依赖关系,应用程序链接同一库的 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 污染。
我的应用程序在 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 污染。