3

我们正在使用 Jenkins 2.60.2 和 CMake 3.9.1 来自动化我们的构建系统。这一切都适用于多个版本的构建工具、架构和调试/发布目标(如果所有配置都已经构建和安装,那么DebugRelease)。

使用find_package ()的仅Debug配置通常会在发现时忽略CMAKE_BUILD_TYPE。脚本在内部搜索文件和库并将位置存储在变量中。在脚本结束时,会扫描变量中的_NOTFOUND字符串,这是在所有引用路径/提示中都没有找到文件或库的结果。因此,如果找不到 Release 库,基本上find_package () 将失败,并将整个包标记为未正确安装,即使构建只对Debug目标严格感兴趣。

通常,XXXConfig.cmake文件使用对find_package_handle_standard_args (.. PATH_TO_LIB) 的调用,该调用在库的路径变量中扫描_NOTFOUND字符串。这些变量通常通过较早的调用find_library (PATH_TO_LIB libname ..)设置为_NOTFOUND 。有关更多信息,请参阅 CMake 文档。

用户确实可以使用“调试”标记调试库并使用“优化”发布库,但这在库发现期间似乎没有帮助,并且仅在链接期间使用。

任何人都知道如何正确处理这个问题?

亲切的问候

4

1 回答 1

3

这是经典使用find_package.

请注意,find_package它还允许基于配置文件包的不同操作模式,这非常适合解决此特定问题,但需要对构建系统进行一些更改。您将需要所有库的配置脚本(如果库本身也是由 CMake 构建的,CMake 可以为您生成它们;如果不是,这可能会有点麻烦),并且依赖的目标将通过导入的目标引用这些库而不是变量(这通常使那些依赖目标的事情变得更容易)。我强烈建议您将此作为长期解决方案。

如果由于某种原因您不能这样做,您将不得不修改您的查找脚本。一种常见的技术是分别搜索调试和发布二进制文件,然后将这些调用中的查找库组合到一个变量中(连同debugoptimized说明符),然后将该变量作为find_package_handle_standard_args. 这样,只要找到两者之一,您的 find 脚本就会很高兴,尽管您最终可能无法构建所有可能的配置。或者,您也可以find_package_handle_standard_args完全跳过调用并手动实现自己的逻辑来检测是否找到了库。正如您从该功能的手册页中看到的那样,它主要做样板的东西,如果需要,可以很容易地用更灵活的手写实现代替。

于 2017-08-28T14:23:06.387 回答