【问题标题】:Best practice to handle release/debug libraries in cmake find module在 cmake find 模块中处理发布/调试库的最佳实践
【发布时间】:2015-06-30 12:23:20
【问题描述】:

我正在尝试为外部库编写一个 cmake 查找模块,并使其在 Windows 下工作。对于带有调试和发布标志(-MD 和 -MDd)的编译版本以及不同的编译器版本,该库具有不同的路径。例如有以下路径:

C:/cplex/lib/x86_windows_vs2012/stat_mda/cplex1262.lib
C:/cplex/lib/x86_windows_vs2012/stat_mdd/cplex1262.lib
C:/cplex/lib/x86_windows_vs2013/stat_mda/cplex1262.lib
C:/cplex/lib/x86_windows_vs2013/stat_mdd/cplex1262.lib

在查找模块中处理此问题的最佳做法是什么?

【问题讨论】:

    标签: windows cmake


    【解决方案1】:

    可以通过两种不同的方式处理发布和调试版本,具体取决于您是提供IMPORTED 库还是仅提供CPLEX_LIBRARIES 变量中的文件列表:

    • 对于IMPORTED 库,您应该使用install(...EXPORT...)install(EXPORT ...) 命令,通过在IMPORTED 目标上设置适当的配置相关属性(例如IMPORTED_LOCATION_DEBUGIMPORTED_LOCATION_RELEASE)来自动处理此问题
    • 如果您的查找模块仅提供变量,例如 CPLEX_LIBRARIES,您可以使用 debugoptimized 说明符:

      set(CPLEX_LIBRARIES optimized <path-to-release.lib> debug <path-to-debug.lib>)
      

    要在 vs2012 和 vs2013 版本之间进行选择,您的查找模块应查询变量 MSVC11MSVC12

    对于其他标志,请参阅 Boost 查找模块的约定。

    我还建议编写配置模块而不是查找模块。

    【讨论】:

    • 谢谢。我是 cmake 和在 Windows 下编译的新手。我不确定 IMPORTED 库会是什么样子,目前我只是将路径添加到 CPLEX_LIBRARIES。我想我还必须使用 install 将 dll 文件放入构建目录,对吗?配置模块和查找模块有什么区别?你能给我指出一些相关的文档吗?
    • 安装:是的,但文件应该安装到安装目录中,路径存储在变量 CMAKE_INSTALL_PREFIX 中。您需要在配置项目时设置此变量(我的意思是,不要在 CMakeLists.txt 中设置它)。对于install 命令,您指定相对于 CMAKE_INSTALL_PREFIX 的路径
    • find/config-module:find 模块安装到某个中心位置,独立于实际包。例如,FindZLIB 在 CMake 发行版中提供,而不是在 ZLIB 中提供。它必须准备好在 ZLIB 可能存在的每个可能位置寻找 ZLIB,它必须在具有各种 ZLIB 构建的每个系统上工作。
    • 另一方面,配置模块随实际产品一起提供。可以更简单,因为它是与产品一起构建的,因此它知道在哪里查找库、标题。
    • 当你调用find_package时,它通常会寻找一个find-module,如果没有找到,就会寻找config-module。
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2011-07-11
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2013-08-23
    相关资源
    最近更新 更多