【问题标题】:One click building my project with Cmake & Msbuild (vs2010) with a batch file使用 Cmake 和 Msbuild (vs2010) 使用批处理文件一键构建我的项目
【发布时间】:2012-02-20 10:49:36
【问题描述】:

我必须使用一个下载所有第 3 方库并编译它们的批处理文件来一键构建为 Cmake 制作的项目(已经在 Linux 上运行)。 (win64)

  1. 如果可能,我不想更改项目 CMakeLists.txt。
  2. 我已经在 VS2010 GUI 中构建了项目。我不得不改变以下内容: 一种。必须更改配置属性-C++-命令行:添加 /DWNT /D "CAD_STATIC" 湾。必须在配置属性中添加一长串库 - 链接器输入 - 附加依赖项。 C。为这些库添加库目录 d。添加包含目录。
  3. 项目编译并运行正常。

现在我只需要使用批处理命令来做同样的事情。 我已经用 cmake 构建了项目文件:

cmake ..\projectsource -G "Visual Studio 10 Win64" -DGLEW_LIBRARY:FILEPATH=%myroot%\glew\trunk\lib\Release\glew.lib -DGLUT_glut_LIBRARY:FILEPATH=%myroot%\freeglut\trunk\lib\Release\freeglut.lib -DMKL_LIBRARIES:FILEPATH=%myroot%\mkl\em64t\lib\mkl_core.lib -DOpenCascade_INCLUDE_DIR:PATH=%myroot%\OpenCascade

现在我需要一个像“devenv project.sln /useenv”这样的命令,它的作用与我在 #2 下所做的相同。

我尝试了一个 env include & lib,例如:

set "include=%myroot%\glew\trunk\include;%myroot%\freeglut\trunk\include;%myroot%\mkl\include;%myroot%\qt\include;%myroot%\OpenCascade\include\oce;%myroot%\trimo\src\CadModel;%include%"
set "lib=%myroot%\glew\trunk\lib\Release\*.lib;%myroot%\freeglut\trunk\lib\Release\*.lib;%myroot%\mkl\em64t\lib\*.lib;%myroot%"\qt\lib\*.lib;%myroot%\OpenCascade\Win64\lib\*.lib;%lib%"

非常感谢所有帮助。我被困住了。谢谢

编辑: 我遇到了另一个问题:

  1. 如何取消链接在 project.sln 中由 cmake 自动链接的库?
  2. 将“lib=%myroot%\glew\trunk\lib\Release*.lib; 链接所有 .lib 文件,就像你将所有库放在 vs2010 gui -Linker input-附加依赖项中一样?

【问题讨论】:

    标签: c++ visual-studio-2010 msbuild batch-file cmake


    【解决方案1】:

    如果您已经设置了所需的 include 和 lib 变量,那么可能缺少的只是:

    set "cl=/DWNT /DCAD_STATIC"
    

    那么你应该可以使用

    devenv project.sln /useenv /build
    

    注意,如果需要,您还可以使用 libpath 为库设置搜索路径。

    其他问题的答案

    1. 我不知道有什么办法。
    2. 没有。我没有注意到你在原来的问题中这样做了 - 抱歉! LIB env var 设置可以在其中找到库的搜索路径,而不是实际库本身的完整路径。

    您想要实现的正是 CMake 擅长的那种场景。当 CMake 可能是问题的解决方案时,你在这里与 CMake 作斗争:-)

    如果我是你,我会编辑 CMakeLists.txt 以包含以下内容:

    SET(MY_ROOT <path to %myroot%>)
    
    FIND_LIBRARY(GLEW_LIBRARY glew ${MY_ROOT}/glew/trunk/lib/Release)
    IF(NOT GLEW_LIBRARY)
      MESSAGE(FATAL_ERROR "glew.lib not found in ${MY_ROOT}/glew/trunk/lib/Release")
    ENDIF()
    
    FIND_LIBRARY(GLUT_glut_LIBRARY freeglut ${MY_ROOT}/freeglut/trunk/lib/Release)
    IF(NOT GLUT_glut_LIBRARY)
      MESSAGE(FATAL_ERROR "freeglut.lib not found in ${MY_ROOT}/freeglut/trunk/lib/Release")
    ENDIF()
    
    FIND_LIBRARY(MKL_LIBRARIES mkl_core ${MY_ROOT}/mkl/em64t/Release)
    IF(NOT MKL_LIBRARIES)
      MESSAGE(FATAL_ERROR "mkl_core.lib not found in ${MY_ROOT}/mkl/em64t/Release")
    ENDIF()
    
    INCLUDE_DIRECTORIES(${MY_ROOT}/OpenCascad)
    
    ADD_DEFINITIONS(-DWNT -DCAD_STATIC)
    
    TARGET_LINK_LIBRARIES(<your target>
                          ${GLEW_LIBRARY}
                          ${GLUT_glut_LIBRARY}
                          ${MKL_LIBRARIES}
                          <any other libs...>
                          )
    

    这都是特定于 Windows 和特定于发行版的。您也可以调整 FIND_LIBRARY 调用以适应 Unix/OSX 选项,或者您可以将其包装在 IF(WIN32) ... ENDIF() 块中。

    如果需要,您也可以为 Debug 版本调用 FIND_LIBRARY(给它们不同的变量名称)并像这样添加它们:

    TARGET_LINK_LIBRARIES(<your target>
                          optimized ${GLEW_LIBRARY}
                          optimized ${GLUT_glut_LIBRARY}
                          optimized ${MKL_LIBRARIES}
                          debug ${GLEW_LIBRARY_DEBUG}
                          debug ${GLUT_glut_LIBRARY_DEBUG}
                          debug ${MKL_LIBRARIES_DEBUG}
                          <any other libs...>
                          )
    

    您还可以通过修改TARGET_LINK_LIBRARIES 调用中传递的库列表,从您想要的任何目标中删除您想要的任何库。

    如果要获取目录中的所有 *.lib 文件,请添加如下内容:

    FILE(GLOB ALL_GLEW_LIBS "${MY_ROOT}/glew/trunk/lib/Release/*.lib")
    TARGET_LINK_LIBRARIES(<your target> ${ALL_GLEW_LIBS})
    

    如果您确实使用了GLOB 调用,并且您还需要调试和发布,请务必在每个列表项前加上debug 或optimized 适当的前缀,例如

    FOREACH(GLEW_ITR ${ALL_GLEW_LIBS_RELEASE})
      SET(ALL_GLEW_LIBS ${ALL_GLEW_LIBS} optimized ${GLEW_ITR})
    ENDFOREACH()
    
    FOREACH(GLEW_ITR ${ALL_GLEW_LIBS_DEBUG})
      SET(ALL_GLEW_LIBS ${ALL_GLEW_LIBS} debug ${GLEW_ITR})
    ENDFOREACH()
    
    TARGET_LINK_LIBRARIES(<your target> ${ALL_GLEW_LIBS})
    

    如果所有这些都由 CMake 提供,则无需在批处理脚本中设置任何环境变量;你只需这样做:

    devenv project.sln /build
    

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多