首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让CMake静态地链接到find_package包中的库?

如何让CMake静态地链接到find_package包中的库?
EN

Stack Overflow用户
提问于 2021-01-26 16:33:09
回答 2查看 1.1K关注 0票数 0

我正在从源代码构建一个库和一个依赖于库的可执行文件。这个库依赖于第三方库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

代码语言:javascript
运行
复制
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_librarylibjpeg的依赖。

有什么方法告诉find_package更喜欢静态库吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-26 16:47:17

在做任何事情之前,您应该修复您的脚本:

代码语言:javascript
运行
复制
target_link_libraries(my_library PRIVATE JPEG::JPEG)

您必须将导入的目标名称指定给target_link_libraries

尽管如此,不,不是直接说的。find_package本身什么也不做,它只是查找正确的脚本并调用它。因此,实际行为是特定于库的。对于libjpeg,可能会找到这个剧本的副本并运行它。

尤其是libjpeg,FindJPEG.cmake无法告诉它更喜欢静态或动态版本。

但是,您可以在调用JPEG_LIBRARY_RELEASE之前定义find_package,以强制它找到特定的版本。例如,如果您这样做:

代码语言:javascript
运行
复制
cmake -DJPEG_LIBRARY_RELEASE=/usr/lib/x86_64-linux-gnu/libjpeg.a .....

然后,您应该获得一个静态构建(用JPEG_LIBRARY_DEBUG替换以定义调试版本)。您几乎可以在任何检测到的东西中强制检测其他内容,因为大多数脚本都不会覆盖命令行中定义的值。

如果这适合你的工作流程,那就完美。否则,您将无法单独使用CMake获得一个干净的解决方案,您应该在此基础上添加一个依赖关系管理器(vcpkg,conan.io)。

票数 2
EN

Stack Overflow用户

发布于 2021-01-26 16:49:59

您可以指定名称:

代码语言:javascript
运行
复制
find_library(JPEGLIB REQUIRED NAMES libjpeg.a)
add_executable(myapp myapp.c)
target_link_libraries(myapp PRIVATE ${JPEGLIB})

名称选项的每个库名首先被视为库文件名,然后使用特定于平台的前缀(例如lib)和后缀(例如.so)来考虑。因此,可以直接指定库文件名,如libfoo.a。这可以用于定位类UNIX系统上的静态库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65905302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档