Создание моего проекта в один клик с помощью Cmake & Msbuild (vs2010) с помощью командного файла - PullRequest
0 голосов
/ 20 февраля 2012

Мне нужно собрать в один клик проект, созданный для Cmake (уже работающий в Linux), с командным файлом, который загружает все сторонние библиотеки и компилирует их. (win64)

  1. Если возможно, я не хочу менять проекты CMakeLists.txt.
  2. Я уже строю проект в VS2010 GUI. и я должен был изменить следующее: а. пришлось изменить свойства конфигурации-C ++ - Командная строка: добавлено / DWNT / D "CAD_STATIC" б. пришлось добавить длинный список библиотек в свойствах конфигурации - вход линкера - дополнительные зависимости. с. добавить каталоги библиотек для этих библиотек д. добавить каталоги включения.
  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%"

Вся помощь очень ценится. Я застрял. Спасибо

Edit: У меня есть другая проблема:

  1. Как я могу отсоединить библиотеку, которая автоматически связывается в project.sln с помощью cmake?
  2. будет "lib =% myroot% \ glew \ trunk \ lib \ Release * .lib; связать все файлы .lib, как вы получили бы, если бы вы поместили все библиотеки в входные данные gui -Linker vs2010 - дополнительные зависимости?

1 Ответ

1 голос
/ 20 февраля 2012

Если вы уже устанавливаете обязательные переменные include и lib, то, вероятно, все, чего не хватает:

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 вызовы для версий Debug, если это необходимо (присваивая им разные имена переменных) и добавляя их, например:

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 vars в пакетном скрипте;Вы просто делаете:

devenv project.sln /build
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...