使用批处理文件使用 Cmake & Msbuild (vs2010) 一键构建我的项目

One click building my project with Cmake & Msbuild (vs2010) with a batch file

本文关键字:一键 构建 我的 项目 批处理文件 Cmake Msbuild vs2010      更新时间:2023-10-16

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

  1. 如果可能的话,我不想更改项目CMakeLists.txt
  2. 我已经在VS2010 GUI中构建了该项目。我不得不更改以下内容:a.必须更改配置属性—C++—命令行:added/DWNT/D"CAD_STATIC"b.必须在配置属性-链接器输入-附加依赖项中添加一长串库。c.为这些库添加库目录d.添加include目录
  3. 该项目编制良好,运行良好

现在我只需要使用批处理命令就可以了。我已经用cmake构建了项目文件:

cmake ..projectsource -G "Visual Studio 10 Win64" -DGLEW_LIBRARY:FILEPATH=%myroot%glewtrunklibReleaseglew.lib -DGLUT_glut_LIBRARY:FILEPATH=%myroot%freegluttrunklibReleasefreeglut.lib -DMKL_LIBRARIES:FILEPATH=%myroot%mklem64tlibmkl_core.lib -DOpenCascade_INCLUDE_DIR:PATH=%myroot%OpenCascade

现在我需要一个类似"devenvproject.sln/useenv"的命令,它的作用与我在#2下所做的相同。

我试着用envinclude&类库:

set "include=%myroot%glewtrunkinclude;%myroot%freegluttrunkinclude;%myroot%mklinclude;%myroot%qtinclude;%myroot%OpenCascadeincludeoce;%myroot%trimosrcCadModel;%include%"
set "lib=%myroot%glewtrunklibRelease*.lib;%myroot%freegluttrunklibRelease*.lib;%myroot%mklem64tlib*.lib;%myroot%"qtlib*.lib;%myroot%OpenCascadeWin64lib*.lib;%lib%"

我们非常感谢所有的帮助。我被卡住了。感谢

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

  1. 如何通过cmake自动取消链接项目.sln中链接的库
  2. 是否会"lib=%myroot%\glew\trunk\lib\Release*.lib;链接所有.lib文件,就像你将所有lib放在vs2010 gui中一样-链接器输入-其他依赖项

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

set "cl=/DWNT /DCAD_STATIC"

那么你应该能够使用

devenv project.sln /useenv /build

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

进一步问题的答案

  1. 我不知道该怎么做
  2. 没有。我没有注意到你在最初的问题中这么做——对不起!LIB env var设置了可以在其中找到库的搜索路径,而不是实际库本身的完整路径

你试图实现的正是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调用,并且还需要DebugRelease,请确保在每个列表项前面加上debugoptimized(视情况而定),例如

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提供,则不需要在批处理脚本中设置任何env-var;你只需要:

devenv project.sln /build
相关文章: