使用批处理文件使用 Cmake & Msbuild (vs2010) 一键构建我的项目
One click building my project with Cmake & Msbuild (vs2010) with a batch file
我必须用一个批处理文件一键构建一个为Cmake制作的项目(已经在Linux上运行),该文件可以下载所有第三方库并编译它们。(win64)
- 如果可能的话,我不想更改项目CMakeLists.txt
- 我已经在VS2010 GUI中构建了该项目。我不得不更改以下内容:a.必须更改配置属性—C++—命令行:added/DWNT/D"CAD_STATIC"b.必须在配置属性-链接器输入-附加依赖项中添加一长串库。c.为这些库添加库目录d.添加include目录
- 该项目编制良好,运行良好
现在我只需要使用批处理命令就可以了。我已经用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%"
我们非常感谢所有的帮助。我被卡住了。感谢
编辑:我遇到了另一个问题:
- 如何通过cmake自动取消链接项目.sln中链接的库
- 是否会"lib=%myroot%\glew\trunk\lib\Release*.lib;链接所有.lib文件,就像你将所有lib放在vs2010 gui中一样-链接器输入-其他依赖项
如果您已经设置了所需的include
和lib
变量,那么可能只缺少:
set "cl=/DWNT /DCAD_STATIC"
那么你应该能够使用
devenv project.sln /useenv /build
注意,如果需要,您还可以使用libpath
来设置库的搜索路径。
进一步问题的答案
- 我不知道该怎么做
- 没有。我没有注意到你在最初的问题中这么做——对不起!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
调用,并且还需要Debug和Release,请确保在每个列表项前面加上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提供,则不需要在批处理脚本中设置任何env-var;你只需要:
devenv project.sln /build
- 文本冒险游戏 - 如何区分一种项目类型与另一种项目类型以及如何构建项目类/子类
- 如何在 Eclipse 中一次从多个源文件进行构建
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 如何从一组具有从左到右优先级的整数值创建有序整数键?
- 有没有一种方法可以在linux中扫描已构建的ARM库中的函数
- 当我尝试构建此程序时,出现此错误:需要左键作为赋值的左操作数
- 如何构建一个 Map,其中键是抽象基类(而不是值)
- cpp 中是否存在一种数据结构,可以轻松地提供一种基于已存在的实例构建新结构的方法
- 如果初始化需要shared_from_this,如何在一次调用中构建一个类
- 如何一次在Visual Studio 2015和Visual Studio 2002中构建C 项目
- 如何使用推力将相同键从一个数组复制到另一个数组的值
- Linux/GCC:是否有一种方法可以检查构建是否与其他机器上的前一个机器相同
- 将Visual Studio C 构建的中间文件移至另一台计算机
- 如何使用BOOST_THREAD_WIN32-MT-S(与mingw交叉键)来构建Boost
- cmake-一次针对多个体系结构,而无需在构建之间进行手动清理
- 如何创建Google+Plus一键,同时已经使用GooglePlay游戏服务SDK for C++实现了排行榜
- 一键构建所有配置和平台
- 使用批处理文件使用 Cmake & Msbuild (vs2010) 一键构建我的项目
- GNU make: Makefile一次构建多个.cpp文件
- QML - 一键锁定/解锁屏幕方向(安卓和最终的 ios)