如何方便地强制 CMAKE 使用特定版本的静态库文件?

Posted

技术标签:

【中文标题】如何方便地强制 CMAKE 使用特定版本的静态库文件?【英文标题】:How to conveniently force CMAKE to use a particular build of static library file? 【发布时间】:2018-09-20 01:29:34 【问题描述】:

我目前在 \usr\local 中安装了一个开源的第 3 方库 A。现在我想对该库进行一些代码更改,但我想在本地文件夹中进行此测试,这样它就不会影响系统库。让我们将本地构建称为 A'。

我有一个可执行文件 B,它使用库 A 作为静态库。在 CMakelists.txt 中,它使用 find_pacakge(A) 来查找安装在 \usr\local 中的那个。让它链接到本地​​文件夹中的 A' 的最简单方法是什么?

我发现如果我将 A' 安装到本地文件夹(或任何不同于 usr\local 的文件夹),我们可以强制 CMAKE 使用 HINTS 在该文件夹中查找包。但是,我希望有更好的方法,甚至无需安装。后 所有,A 和 A' 使用相同的头文件,只是位于不同的位置。所以我认为 include_directories 不需要更改。但我不知道如何将库链接到指定文件夹中的指定文件,而不是从 find_package 找到的默认系统文件夹。

真的是 Cmake 的新手,我希望我说清楚了。非常感谢

【问题讨论】:

【参考方案1】:

1) 通常你把所有东西都拿走,即不包括这里和那里的库,在现代 CMake 中你也可以使用 target_include_directory() 所以包括和库是“耦合”在一起的,即你通过一个 find_package() 调用得到所有东西。 参考:https://cmake.org/cmake/help/latest/command/target_include_directories.html

2) 看看CMAKE_PREFIX_PATH,如果你想找到 A' 而不是 A,这是修改默认搜索路径的正确方法> 参考:https://cmake.org/cmake/help/latest/variable/CMAKE_PREFIX_PATH.html

3) 如果你想使用 A' 的构建目录,那么 CMake 项目 A' 必须使用“export()”,这样你就可以直接从 buildir 中使用它。 注意:很少有项目支持它,正确的方法是先安装(在本地文件夹中)然后使用它。 参考:https://cmake.org/cmake/help/latest/command/export.html

【讨论】:

谢谢。还有一个问题:当我查看find_package() 使用的 ConfigXXX.cmake 时,我可以看到输出只有包含文件夹和目标名称。没有实际的库文件位置。我想知道 Cmake 在哪里以及如何计算出从目标名称到系统文件夹中 .a 文件的实际映射。

以上是关于如何方便地强制 CMAKE 使用特定版本的静态库文件?的主要内容,如果未能解决你的问题,请参考以下文章

CMake 学习四:CMake 构建静态库和动态库

如何强制 CMake 使用系统上安装的特殊版本的 Protobuf?

cmake 强制链接静态库

如何强制 cmake 在没有完整路径的情况下使用 cl.exe?

Android NDK编译如何强制使用libc++.a的静态链接库

如果存在多个依赖项,则强制 cmake 选择依赖位置