CMake 链接器找不到不以 "lib" 开头的库



我正在使用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

最新更新