2012-02-20 77 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

相關問題