2012-02-20 43 views
0

我必须使用批处理文件一次点击构建Cmake(已经在Linux上工作),下载所有第三方库并编译它们。 (win64)用Cmake&Msbuild(vs2010)建立我的项目与批处理文件

  1. 如果posible我不想更改projets CMakeLists.txt。
  2. 我已经在VS2010 GUI中构建了这个项目。我不得不改变下面的内容: a。必须更改配置属性-C++ - 命令行:添加/ DWNT/D“CAD_STATIC” b。必须在配置属性 - 链接器输入 - 附加依赖关系中添加一长串库。 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 

现在我需要这样的不一样的东西,我在#2做“devenv的project.sln了/ useenv”的命令。

我用ENV尝试包括& 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输入 - 附加的依赖?

回答

1

如果你已经设定所需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()块中。

你也可以做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打电话来,你还需要调试发布,可以肯定的根据需要在每个列表项目前加上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在批处理脚本瓦尔;你只需要:

devenv project.sln /build 
+0

非常感谢! – pazduha 2012-02-21 10:37:25

相关问题