如何为主机应用程序和任何使用过的库使用单独的CMake目标?

时间:2014-09-14 21:24:33

标签: c++ cmake

当我使用也使用CMake的CMake和库时,我在我的CMake项目中添加库目录以允许在我的项目旁边构建库。例如:

 # add SFML library dependencies
 add_subdirectory("third_party/lib/SFML")
 include_directories("third_party/lib/SFML/include")
 target_link_libraries(${CMAKE_PROJECT_NAME} sfml-system sfml-window sfml-graphics)

然后CMake自动匹配项目 Debug 构建以使用库 Debug 构建,并将项目 Release 构建以使用库 Release build。在某些情况下,为主项目和它使用的每个库单独控制构建目标是有用的。例如,如果我对在库代码中调试不感兴趣,我将只想在 Debug 模式中构建我的代码并将其链接到 Release 版本图书馆,因为我不想牺牲额外的表现。在其他情况下,我可能只想在其中一个已使用的库中进行调试,如果我对其中的bug有疑问,但出于性能原因,我想要链接所有其他库的发行版本。是否有可能以及实现此行为的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

对于来自同一构建树的导入目标和依赖目标,您将始终获得所描述的行为,即每个配置都使用其自己的库匹配构建。弄乱这个意味着摆弄CMake的内部,所以我建议反对它。

如果要链接特定版本的库,最强大的方法是使用find_library。请注意,只有在配置时以二进制形式提供库依赖项时,这才有效。也就是说,您不能再将依赖项构建为依赖项目的一部分。

如果这不是一个选项,请考虑使用ExternalProject_Add来构建依赖项并手动指定依赖项二进制文件的位置。

总而言之,您当前的方法是最方便的方法,所以只有在依赖项的调试构建的性能是一个真正的问题时才改变它。另请注意,虽然混合调试和发布版本对于C库来说非常好,但它很容易破坏C ++库,特别是如果接口上有标准库类型。