使用 cmake 编译后,执行时未找到库
Library not found on execution, after compiling using cmake
我在我的项目中使用 cmake。
CMakeLists.txt代码是:
set( GS7_INCLUDE_DIRS "${EXTERNAL_PATH}/ds_sdk/SDK_GS7.0/include" CACHE PATH "SDK GS7.0 include directory" )
set( GS7_LIBRARIES "${EXTERNAL_PATH}/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49/libdsDriverGCC49.so" "${EXTERNAL_PATH}/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49/libdsUtilGCC49.so" CACHE FILEPATH "SDK GS7.0 libdsDriver full path" )
...
add_executable( FxLibLoader ... )
...
target_link_libraries( FxLibLoader
"${GS7_LIBRARIES}"
...
)
当我执行 cmake --build
时,最终的 link 命令是
c++ -g CMakeFiles/FxLibLoader.dir/FxLibLoader.cpp.o CMakeFiles/FxLibLoader.dir/FxLogger.cpp.o CMakeFiles/FxLibLoader.dir/mtoProto.pb.cc.o CMakeFiles/FxLibLoader.dir/Stats.cpp.o -o FxLibLoader -L/mnt/e/Desarrollo/sandbox_MTO/externalLibs/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49 -Wl,-rpath,/mnt/e/Desarrollo/PYMX_II/Mto/MtoApi/debug:/mnt/e/Desarrollo/sandbox_MTO/externalLibs/protobuf/protobuf-3.10.1/linux/lib/x64:/mnt/e/Desarrollo/sandbox_MTO/externalLibs/Hazelcast/linux/lib/x64:/mnt/e/Desarrollo/sandbox_MTO/externalLibs/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49 /mnt/e/Desarrollo/PYMX_II/Mto/MtoApi/debug/libMtoApi_d.so /mnt/e/Desarrollo/sandbox_MTO/externalLibs/protobuf/protobuf-3.10.1/linux/lib/x64/libprotobuf.so /usr/lib/x86_64-linux-gnu/libpython2.7.so -ldl /mnt/e/Desarrollo/sandbox_MTO/externalLibs/Hazelcast/linux/lib/x64/libHazelcastClient3.12_64.so -ldsDriverGCC49 -ldsUtilGCC49 -lstdc++fs
link 选项很好。编译和 linking 没有错误地完成,但是当我这样做时
>ldd FxLibLoader | fgrep found
libdsUtilGCC49.so => not found
但是,libdsDriverGCC49.so 库,它与丢失的目录在同一目录中...找到了!
此外,如果我这样做
LD_LIBRARY_PATH='/mnt/e/Desarrollo/sandbox_MTO/externalLibs/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49' ldd FxLibLoader | fgrep found
我得到空结果,所有库都位于!
- 我做错了什么?
- 我该如何解决?
What am I doing wrong?
您希望链接器在 /mnt/e/Desarrollo/sandbox_MTO/externalLibs/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49
目录中搜索库,而链接器不会。
How do I solve it ?
指示链接器在该目录中搜索库,或将库复制到链接器已搜索的目录之一。有关详细信息,请参阅 man ld
。您可能想对 -rpath
.
感兴趣
我在我的项目中使用 cmake。
CMakeLists.txt代码是:
set( GS7_INCLUDE_DIRS "${EXTERNAL_PATH}/ds_sdk/SDK_GS7.0/include" CACHE PATH "SDK GS7.0 include directory" )
set( GS7_LIBRARIES "${EXTERNAL_PATH}/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49/libdsDriverGCC49.so" "${EXTERNAL_PATH}/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49/libdsUtilGCC49.so" CACHE FILEPATH "SDK GS7.0 libdsDriver full path" )
...
add_executable( FxLibLoader ... )
...
target_link_libraries( FxLibLoader
"${GS7_LIBRARIES}"
...
)
当我执行 cmake --build
时,最终的 link 命令是
c++ -g CMakeFiles/FxLibLoader.dir/FxLibLoader.cpp.o CMakeFiles/FxLibLoader.dir/FxLogger.cpp.o CMakeFiles/FxLibLoader.dir/mtoProto.pb.cc.o CMakeFiles/FxLibLoader.dir/Stats.cpp.o -o FxLibLoader -L/mnt/e/Desarrollo/sandbox_MTO/externalLibs/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49 -Wl,-rpath,/mnt/e/Desarrollo/PYMX_II/Mto/MtoApi/debug:/mnt/e/Desarrollo/sandbox_MTO/externalLibs/protobuf/protobuf-3.10.1/linux/lib/x64:/mnt/e/Desarrollo/sandbox_MTO/externalLibs/Hazelcast/linux/lib/x64:/mnt/e/Desarrollo/sandbox_MTO/externalLibs/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49 /mnt/e/Desarrollo/PYMX_II/Mto/MtoApi/debug/libMtoApi_d.so /mnt/e/Desarrollo/sandbox_MTO/externalLibs/protobuf/protobuf-3.10.1/linux/lib/x64/libprotobuf.so /usr/lib/x86_64-linux-gnu/libpython2.7.so -ldl /mnt/e/Desarrollo/sandbox_MTO/externalLibs/Hazelcast/linux/lib/x64/libHazelcastClient3.12_64.so -ldsDriverGCC49 -ldsUtilGCC49 -lstdc++fs
link 选项很好。编译和 linking 没有错误地完成,但是当我这样做时
>ldd FxLibLoader | fgrep found
libdsUtilGCC49.so => not found
但是,libdsDriverGCC49.so 库,它与丢失的目录在同一目录中...找到了!
此外,如果我这样做
LD_LIBRARY_PATH='/mnt/e/Desarrollo/sandbox_MTO/externalLibs/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49' ldd FxLibLoader | fgrep found
我得到空结果,所有库都位于!
- 我做错了什么?
- 我该如何解决?
What am I doing wrong?
您希望链接器在 /mnt/e/Desarrollo/sandbox_MTO/externalLibs/ds_sdk/SDK_GS7.0/lib/linux/x64/gcc49
目录中搜索库,而链接器不会。
How do I solve it ?
指示链接器在该目录中搜索库,或将库复制到链接器已搜索的目录之一。有关详细信息,请参阅 man ld
。您可能想对 -rpath
.