我正在使用CMake编译一个使用github上的HSImage库的应用程序。使用pip安装后,HSI库生成一个共享库文件,在我的情况下,它是在/usr/src/HSI/HSI.cpython-36m-aarch64-linux-gnu.so
中创建的
我正试图用CMake将此库链接到我的应用程序,但CMakefind_library
方法在查找库时遇到一些问题。这是我的CMakeLists.txt文件的相关部分:
CMakeLists.txt
set(HSI_DIR /usr/src/HSI)
find_library(HSI_LIB HSI.cpython-36m-aarch64-linux-gnu PATHS ${HSI_DIR})
message(STATUS "HSI: ${HSI_LIB}") # outputs /usr/src/HSI/HSI.cpython-36m-aarch64-linux-gnu.so
add_executable(${TARGET_NAME} <sources...>)
target_link_directories(${TARGET_NAME} PUBLIC ${HSI_DIR})
target_link_libraries(${TARGET_NAME}
${HSI_LIB}
<other libs...>
-Wl,--unresolved-symbols=ignore-in-shared-libs
)
构建时,会产生以下错误消息:
cd /home/nvidia/projects/HsiInference/build;/usr/local/bin/cmake --build "/home/nvidia/projects/HsiInference/build" --target hsi_inference_onnx -- ;
Scanning dependencies of target hsi_inference_onnx
[ 14%] Building CXX object CMakeFiles/hsi_inference_onnx.dir/targets/HsiInferenceOnnx/main_onnx.cpp.o
[ 28%] Building CXX object CMakeFiles/hsi_inference_onnx.dir/targets/HsiInferenceOnnx/HsiInferenceOnnx.cpp.o
[ 42%] Building CXX object CMakeFiles/hsi_inference_onnx.dir/src/ftpnano.cpp.o
[ 57%] Building CXX object CMakeFiles/hsi_inference_onnx.dir/src/getOptions.cpp.o
[ 71%] Building CXX object CMakeFiles/hsi_inference_onnx.dir/src/logger.cpp.o
[ 85%] Building CXX object CMakeFiles/hsi_inference_onnx.dir/src/utils.cpp.o
[100%] Linking CXX executable hsi_inference_onnx_debug
CMakeFiles/hsi_inference_onnx.dir/build.make:245: recipe for target 'hsi_inference_onnx_debug' failed
CMakeFiles/Makefile2:123: recipe for target 'CMakeFiles/hsi_inference_onnx.dir/all' failed
**/usr/bin/ld: cannot find -lHSI.cpython-36m-aarch64-linux-gnu**
**collect2: error: ld returned 1 exit status**
make[3]: *** [hsi_inference_onnx_debug] Error 1
make[2]: *** [CMakeFiles/hsi_inference_onnx.dir/all] Error 2
CMakeFiles/Makefile2:130: recipe for target 'CMakeFiles/hsi_inference_onnx.dir/rule' failed
make[1]: *** [CMakeFiles/hsi_inference_onnx.dir/rule] Error 2
Makefile:196: recipe for target 'hsi_inference_onnx' failed
make: *** [hsi_inference_onnx] Error 2
Build failed.
重要部分:
/usr/bin/ld: cannot find -lHSI.cpython-36m-aarch64-linux-gnu
collect2: error: ld returned 1 exit status
根据我所收集的信息,target_link_libraries
只是将-l<library_name>
添加到link命令中,而-l<library_name>
假设有一个名为lib<library_name>.so
的文件要链接,但这里的情况并非如此如何让CMake正确链接库,尽管文件名很奇怪
注意:我能够通过以下操作来构建项目:
- 删除项目的
build
目录以清除CMake缓存 - 重命名文件或创建指向
libhsi.so
的符号链接 - 将CMakeLists.txt更改为
find_library(HSI_LIB hsi PATHS ${HSI_DIR})
这将链接命令改为-lhsi
,它能够找到重命名的/软链接的库文件。然而,这对我来说并不理想,最初的问题仍然没有答案:(
对于具有奇怪文件名的库,您应该在文件名之前添加:
。小心,如中所述https://linux.die.net/man/1/ld:如果namespec的格式为:filename,ld将在库路径中搜索名为filename的文件,否则将在库道路中搜索名名为libnamespec.a的文件(namespec是-l之后的内容(。
对于您的示例,您应该将target_link_libraries中的${HSI_LIB}
替换为:${HSI_LIB}.so
。