有一个项目收集了2个库TinyEXIF和tinyxml2,其中TinyEXIF需要tinyxml2。 CMakeLists.txt:
option(BUILD_TINYEXIF "Build 3rdparty library TinyEXIF with tinyxml2" OFF)
if(BUILD_TINYEXIF)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/tinyxml2)
execute_process(
COMMAND ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/tinyxml2
-DCMAKE_INSTALL_PREFIX=tinyxml2_install
-DBUILD_SHARED_LIBS=ON
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tinyxml2
)
execute_process(
COMMAND ${CMAKE_COMMAND} --build .
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tinyxml2
)
execute_process(
COMMAND ${CMAKE_COMMAND} --install .
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/tinyxml2
)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/TinyEXIF)
execute_process(
COMMAND ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/TinyEXIF
-DCMAKE_INSTALL_PREFIX=TinyEXIF_install
-DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=OFF
-Dtinyxml2_DIR=${CMAKE_BINARY_DIR}/tinyxml2/tinyxml2_install/lib/cmake/tinyxml2
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/TinyEXIF
)
execute_process(
COMMAND ${CMAKE_COMMAND} --build .
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/TinyEXIF
)
execute_process(
COMMAND ${CMAKE_COMMAND} --install .
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/TinyEXIF
)
set(tinyxml2_DIR "${CMAKE_BINARY_DIR}/tinyxml2/tinyxml2_install/lib/cmake/tinyxml2")
set(TinyEXIF_DIR "${CMAKE_BINARY_DIR}/TinyEXIF/TinyEXIF_install/lib/cmake/TinyEXIF")
#list(APPEND CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}/TinyEXIF/TinyEXIF_install/lib")
#list(APPEND CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}/tinyxml2/tinyxml2_install/lib")
endif()
find_package(tinyxml2 CONFIG REQUIRED)
find_package(TinyEXIF CONFIG REQUIRED)
file(GLOB_RECURSE SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*")
file(GLOB_RECURSE HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/include/*")
add_executable(Geotags ${SOURCES} ${HEADERS})
include_directories("${CMAKE_BINARY_DIR}/TinyEXIF/TinyEXIF_install/include")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
target_link_libraries(Geotags
TinyEXIF
)
配置完成后,在build文件夹中会出现必要的库,以及这个库的安装文件夹,结构如下:
build ->
TinyEXIF ->
libTinyEXIF.so
libTinyEXIF.so.1
libTinyEXIF.so.1.0.3
TinyEXIF_install ->
lib ->
libTinyEXIF.so
libTinyEXIF.so.1
libTinyEXIF.so.1.0.3
....
tinyxml2 ->
libtinyxml2.so
libtinyxml2.so.10
libtinyxml2.so.10.0.0
tinyxml2_install ->
lib ->
libtinyxml2.so
libtinyxml2.so.10
libtinyxml2.so.10.0.0
当我启动它时,弹出以下内容:
./Geotags: error while loading shared libraries: libtinyxml2.so.10: cannot open shared object file: No such file or directory
针对 build/TinyEXIF/TinyEXIF_install/libTinyEXIF.so 文件的 ldd 命令输出:
linux-vdso.so.1 (0x00007ffd8979b000)
libtinyxml2.so.10 => not found
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa640735000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa64064c000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa64061e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa64040c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa6409d5000)
针对 build/TinyEXIF/libTinyEXIF.so 文件的 ldd 命令输出:
linux-vdso.so.1 (0x00007ffd6d9db000)
libtinyxml2.so.10 => build/tinyxml2/tinyxml2_install/lib/libtinyxml2.so.10 (0x00007f4ad3c46000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4ad39bd000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4ad38d4000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4ad38a6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4ad3694000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4ad3c7e000)
也就是说,安装后该库就与其依赖项失去连接。但是,如果您强制沿着路径 build/TinyEXIF/libTinyEXIF.so 推送库,那么一切都会正常。另外,如果您通过 clang 进行编译,ldd 输出是相同的,但程序启动并运行。但是在gcc的情况下,就会出现这个错误。这与什么有关?我阅读了有关 RPATH 的文档,但是在研究了相应的变量后,它并没有帮助我。