CMake 和 Makefile 中的多架构
Multi-Architecture in CMake and Makefiles
我正在使用 CMake 为 Visual Studio 生成解决方案并为 Windows 生成 Makefile。我已经成功地为调试和发布类型创建了不同的文件夹,并且在我的解决方案中找到了这两个选项。
现在我有 3 个问题:
- 我想对 win32 和 x64 做同样的事情吗?可能吗 ? 编辑:经过一些研究,似乎不可能?)
- 还有另一个问题,当我生成 "NMake Makefiles" 时,我无法在我的 makefile 中检索我的两种类型(发布和调试)!我可以在哪些文件中检索它?
- 编辑: 我如何使用 NMake 命令在 CLI 中设置调试或发布?
这是我的 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
谢谢
我不太了解 nmake 或 cmake nmake 生成器,但如果它类似于 makefile 生成器,那么你所有三个问题的答案都是 "you can't"。
对于第一个问题,Visual Studio(据我了解)不像支持构建类型那样支持多种架构;当然 cmake 生成的 Visual Studio 项目文件不能做到这一点。
对于第二个问题,cmake 生成的 makefile 不支持构建类型,我假设 nmake 也有同样的限制。我希望这只是 cmake makefile 生成器中的一个限制; makefile 中没有不支持多种构建类型 的内在原因。
与第三个问题类似,由于您无法通过 makefile/nmake 输出支持多种构建类型,因此您当然无法在命令行上选择要构建的类型。
所有这些问题的答案是,您必须使用不同的标志重新 运行 cmake 以 select 不同的选项(体系结构和构建类型)。
如果您担心的是不必清理工作区并每次都从头开始重新配置并丢失以前的工作,那么您应该研究一下 cmake 的源外构建功能。基本上,而不是使用:
cmake .
你使用类似的东西:
mkdir obj-x86
cd obj-x86
cmake ..
mkdir ..\obj-x64
cd ..\obj-x64
cmake ..
您 运行 在不同的目录(不必是子目录)中为每个不同的配置创建 cmake。他们都可以共享同一个源代码树。有时当你第一次尝试这个时,你会发现你的 cmake 文件中的问题,它们假设一个特定的工作目录等,你可能需要更新它们以使用像 CMAKE_SOURCE_DIR
这样的变量而不是相对变量路径。
我正在使用 CMake 为 Visual Studio 生成解决方案并为 Windows 生成 Makefile。我已经成功地为调试和发布类型创建了不同的文件夹,并且在我的解决方案中找到了这两个选项。
现在我有 3 个问题:
- 我想对 win32 和 x64 做同样的事情吗?可能吗 ? 编辑:经过一些研究,似乎不可能?)
- 还有另一个问题,当我生成 "NMake Makefiles" 时,我无法在我的 makefile 中检索我的两种类型(发布和调试)!我可以在哪些文件中检索它?
- 编辑: 我如何使用 NMake 命令在 CLI 中设置调试或发布?
这是我的 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
谢谢
我不太了解 nmake 或 cmake nmake 生成器,但如果它类似于 makefile 生成器,那么你所有三个问题的答案都是 "you can't"。
对于第一个问题,Visual Studio(据我了解)不像支持构建类型那样支持多种架构;当然 cmake 生成的 Visual Studio 项目文件不能做到这一点。
对于第二个问题,cmake 生成的 makefile 不支持构建类型,我假设 nmake 也有同样的限制。我希望这只是 cmake makefile 生成器中的一个限制; makefile 中没有不支持多种构建类型 的内在原因。
与第三个问题类似,由于您无法通过 makefile/nmake 输出支持多种构建类型,因此您当然无法在命令行上选择要构建的类型。
所有这些问题的答案是,您必须使用不同的标志重新 运行 cmake 以 select 不同的选项(体系结构和构建类型)。
如果您担心的是不必清理工作区并每次都从头开始重新配置并丢失以前的工作,那么您应该研究一下 cmake 的源外构建功能。基本上,而不是使用:
cmake .
你使用类似的东西:
mkdir obj-x86
cd obj-x86
cmake ..
mkdir ..\obj-x64
cd ..\obj-x64
cmake ..
您 运行 在不同的目录(不必是子目录)中为每个不同的配置创建 cmake。他们都可以共享同一个源代码树。有时当你第一次尝试这个时,你会发现你的 cmake 文件中的问题,它们假设一个特定的工作目录等,你可能需要更新它们以使用像 CMAKE_SOURCE_DIR
这样的变量而不是相对变量路径。