我正在从源代码构建一个库和一个依赖于库的可执行文件。这个库依赖于第三方库libjpeg
,我想通过静态链接来处理它。libjpeg
安装在我的系统上。我可以在.a
上看到/usr/lib/x86_64-linux-gnu/libjpeg.a
文件(我正在Ubuntu上构建)。
在处理库的CMakeLists.txt
文件时,CMake成功地找到了libjpeg
,但是它的输出宣布is找到了libjpeg的动态版本,即来自CMake的输出是
-找到JPEG: /usr/lib/x86_64-linux-gnu/libjpeg.so (找到版本"80")
然后在CMakeLists.txt
的后面,我将我的库链接到libjpeg
target_link_libraries( my_library
PRIVATE JPEG
)
建筑是成功的。但是,当我从my_library链接到my_executable时,我会得到以下错误:
100%链接CXX可执行文件my_executable /usr/bin/ ld :无法找到-lJPEG collect2: error: ld返回1退出状态
这意味着问题在于,由于my_library
是动态链接到libjpeg
的,所以需要从可执行文件而不是库中将target_link_libraries
链接到libjpeg
。无论如何,我想做的是完全隐藏my_library
对libjpeg
的依赖。
有什么方法告诉find_package
更喜欢静态库吗?
发布于 2021-01-26 16:47:17
在做任何事情之前,您应该修复您的脚本:
target_link_libraries(my_library PRIVATE JPEG::JPEG)
您必须将导入的目标名称指定给target_link_libraries
。
尽管如此,不,不是直接说的。find_package
本身什么也不做,它只是查找正确的脚本并调用它。因此,实际行为是特定于库的。对于libjpeg,可能会找到这个剧本的副本并运行它。
尤其是libjpeg,FindJPEG.cmake
无法告诉它更喜欢静态或动态版本。
但是,您可以在调用JPEG_LIBRARY_RELEASE之前定义find_package,以强制它找到特定的版本。例如,如果您这样做:
cmake -DJPEG_LIBRARY_RELEASE=/usr/lib/x86_64-linux-gnu/libjpeg.a .....
然后,您应该获得一个静态构建(用JPEG_LIBRARY_DEBUG
替换以定义调试版本)。您几乎可以在任何检测到的东西中强制检测其他内容,因为大多数脚本都不会覆盖命令行中定义的值。
如果这适合你的工作流程,那就完美。否则,您将无法单独使用CMake获得一个干净的解决方案,您应该在此基础上添加一个依赖关系管理器(vcpkg,conan.io)。
发布于 2021-01-26 16:49:59
您可以指定名称:
find_library(JPEGLIB REQUIRED NAMES libjpeg.a)
add_executable(myapp myapp.c)
target_link_libraries(myapp PRIVATE ${JPEGLIB})
名称选项的每个库名首先被视为库文件名,然后使用特定于平台的前缀(例如lib)和后缀(例如.so)来考虑。因此,可以直接指定库文件名,如libfoo.a。这可以用于定位类UNIX系统上的静态库。
https://stackoverflow.com/questions/65905302
复制相似问题