c++ - 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>
到链接命令,并-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 之后的内容)。
对于您的示例,您应该 ${HSI_LIB}
在 target_link_libraries 中 替换为:${HSI_LIB}.so
.
推荐阅读
- javascript - testcafe RequestLogger 不拦截 api 调用
- php - 嵌套文档插入为对象而不是数组
- php - 从 txt 文件中获取值并在 PHP 中每次重新加载时随机更改
- elasticsearch - 弹性精确匹配和子串匹配在一起
- r - 将数据导出到 Stata/SPSS 后更改/重新编码基础值代码
- google-apps-script - 限制 Google 表格中的行数
- c# - 无法加载文件或程序集 - 停止后启动 Azure 应用服务
- python - 我可以获得在运行时传递给我的 python 函数的内容的 AST 表示吗?
- python - 如何让我的循环停止迭代,以便在错误为 10^-6 时停止
- react-native - 在 React Native 中单击 3 个点时打开菜单的更好解决方案