Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 在cmake find模块中处理发布/调试库的最佳实践_Windows_Cmake - Fatal编程技术网

Windows 在cmake find模块中处理发布/调试库的最佳实践

Windows 在cmake find模块中处理发布/调试库的最佳实践,windows,cmake,Windows,Cmake,我正在尝试为一个外部库编写一个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/cpl

我正在尝试为一个外部库编写一个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

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

发布和调试版本可以采用两种不同的方式处理,具体取决于您是提供导入的
库还是仅提供
CPLEX\u库中的文件列表
变量:

  • 对于导入的
    库,应使用
    install(…EXPORT…
    cand
    install(EXPORT…
    命令,该命令通过在导入的
    目标上设置适当的配置相关属性来自动处理此问题(例如,
    IMPORTED\u LOCATION\u DEBUG
    IMPORTED\u LOCATION\u RELEASE
  • 如果查找模块仅提供变量,如
    CPLEX\u库
    ,则可以使用
    debug
    优化的
    说明符:

    set(CPLEX_LIBRARIES optimized <path-to-release.lib> debug <path-to-debug.lib>)
    
    set(CPLEX\u库优化调试)
    
要在vs2012和vs2013版本之间进行选择,查找模块应查询变量
MSVC11
MSVC12

有关其他标志,请参阅Boost find模块了解约定


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

谢谢。我不熟悉在Windows下制作和编译。我不确定导入的库会是什么样子,目前我只是添加到CPLEX_库的路径。我想我还必须使用install将dll文件放入构建目录,对吗?有什么区别在配置模块和查找模块之间?你能给我指一些相关文档吗?安装:是的,但文件应该安装到安装目录中,路径存储在变量CMAKE_install_前缀中。配置项目时需要设置此变量(我的意思是,不要在CMakeLists.txt中设置)。对于
install
命令,指定相对于CMAKE_install_PREFIXfind/config模块的路径:查找模块安装到某个中心位置,独立于实际的软件包。例如,FindZLIB在CMAKE发行版中提供,而不是与ZLIB一起提供。它必须准备在ZLIB可以找到的每个可能位置查找ZLIB当然,它必须在每个具有各种ZLIB构建的系统上工作。另一方面,配置模块随实际产品一起提供。可以简单得多,因为它是与产品一起构建的,所以它知道在哪里查找库、头。当调用
find\u package
时,它通常会查找查找模块,如果找不到,则查找config模块。