2015-01-22 2 views
1

Я использую CMake для создания решения для Visual Studio и Makefile для Windows. Мне уже удалось создать другую папку для типов отладки и выпуска, и я нашел два варианта в своем решении.Multi-Architecture в CMake и Makefiles

Теперь у меня есть 3 вопроса:

  1. Я хочу сделать то же самое для win32 и x64? Является ли это возможным ? EDIT: После некоторого исследования это кажется невозможным?)
  2. И еще один вопрос, когда я генерирую «NMake Makefiles», я не могу получить два моих типа (выпуск и отладка) в моем make-файле! В каких файлах я могу получить это?
  3. EDIT: И как я могу установить отладку или выпуск в CLI с помощью команды NMake?

Вот мой CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 

# Configuration of Types 
MESSAGE("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}") 
SET(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" FORCE) 

#Configuration of zlib.lib 

PROJECT(zlib C) 
# Path of Release 
SET(LIB_RELEASE_PATH "../cmake_x64") 
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${LIB_RELEASE_PATH}/lib/") 
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${LIB_RELEASE_PATH}/lib/") 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${LIB_RELEASE_PATH}/lib/") 
# Path of Debug 
SET(LIB_DEBUG_PATH "../cmake_x64d") 
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${LIB_DEBUG_PATH}/lib/") 
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${LIB_DEBUG_PATH}/lib/") 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${LIB_DEBUG_PATH}/lib/") 

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3") 
ADD_DEFINITIONS("/Gm" -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_UNICODE) 

# Files of librairy 
ADD_LIBRARY(

    zlib 

    STATIC 

    ../.c 
    and 
    ../.h 

) 

#Configuration of core.dll 
project(core CXX) 
# Path of Release 
SET(BIN_RELEASE_PATH "../cmake_x64") 
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${BIN_RELEASE_PATH}/bin/") 
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${BIN_RELEASE_PATH}/bin/") 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${BIN_RELEASE_PATH}/bin/") 
# Path of Debug 
SET(BIN_DEBUG_PATH "../cmake_x64d") 
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${BIN_DEBUG_PATH}/bin/") 
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${BIN_DEBUG_PATH}/bin/") 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${BIN_DEBUG_PATH}/bin/") 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") 
set_property(GLOBAL PROPERTY LINK_LIBRARY_DEPENDENCIES "yes") 
add_definitions(-D_UNICODE -D_USRDLL -DCORE_EXPORTS) 
add_definitions("/Gm") 

# Files of librairy 
add_library(

     core 

     SHARED 

    ../.h 
    and 
    ../.cpp 

) 
link_directories("/build/lib/") 
target_link_libraries(core zlib) 

#END OF FILE 

Благодаря

ответ

2

Я не знаю много о NMAKE или генератора CMake NMake, но если это что-то вроде генератора Makefile тогда ответ на все три вопроса: «вы не можете».

Для первого вопроса Visual Studio (по моему мнению) не поддерживает несколько архитектур так, как поддерживает типы сборки; конечно, файлы проекта Visual Studio, созданные с помощью cmake, не могут этого сделать.

Для второго вопроса make-файлы, созданные cmake, не поддерживают типы сборки, и я предполагаю, что nmake имеет такое же ограничение. Я ожидаю, что это всего лишь ограничение в генераторе make-файлов cmake; в make-файлах нет неотъемлемой причины, чтобы поддерживать несколько типов сборки не удалось.

Аналогичным образом для третьего вопроса, так как вы не можете поддерживать несколько типов сборки с выходом makefile/nmake, вы, конечно же, не можете выбрать, какой из них построить в командной строке.

Ответ на все эти вопросы: вы должны повторно запустить cmake с разными флагами, чтобы выбрать различные параметры (архитектура и тип сборки).

Если вы беспокоитесь о том, что вам не нужно очищать рабочее пространство и каждый раз переконфигурировать его с нуля и потерять предыдущую работу, тогда вы должны изучить функцию сборки out-of-source cmake. В принципе, вместо использования:

cmake . 

использовать что-то вроде:

mkdir obj-x86 
cd obj-x86 
cmake .. 

mkdir ..\obj-x64 
cd ..\obj-x64 
cmake .. 

Вы запускаете CMake в другой директории (не должен быть подкаталог) для каждой отдельной конфигурации. Они могут использовать одно и то же дерево исходных текстов. Иногда, когда вы впервые пытаетесь это сделать, вы обнаружите проблемы в ваших файлах cmake, где они принимают определенный рабочий каталог и т. Д., И вам может потребоваться обновить их, чтобы использовать переменные, такие как CMAKE_SOURCE_DIR, а не относительные пути.

+0

OK. Спасибо за этот ответ. Я читал то же самое на другом форуме. Но это означает, что я должен иметь CMakeLists в каждой папке? Или как я могу сказать, чтобы CMake собирал свои файлы в другой папке в командной строке? – Algorys

+0

Я не понимаю, что вы подразумеваете под «каждой папкой». Вам больше не нужно создавать файлы CMakeLists.txt, чем раньше. Каталоги, которые вы создаете для хранения объектов, - _empty_: обратите внимание на шаги выше. Я запускаю mkdir, затем cd в них, а затем запускаю cmake; у них нет никакого содержания. Вместо запуска «cmake». в корне вашего исходного дерева, как обычно, вы запускаете cmake из нового пустого каталога и передаете путь к исходному каталогу в качестве аргумента вместо «.». – MadScientist

+0

Хорошо. Я понимаю, я забыл, что сборка CMake в текущей папке. Большое спасибо. – Algorys

Смежные вопросы