CMake和Makefiles中的多架构

时间:2015-01-22 09:53:03

标签: makefile cmake

我使用CMake为Visual Studio和Makefile for Windows生成解决方案。我已经成功为调试和发布类型创建了不同的文件夹,我在我的解决方案中找到了两个选项。

现在我有3个问题:

  1. 我想为win32和x64做同样的事情吗?可能吗 ? 编辑:经过一些研究,似乎不可能?)
  2. 另一个问题,当我生成" NMake Makefiles"我无法在makefile中检索我的两种类型(发布和调试)!我可以在哪些文件中检索这个?
  3. 编辑:如何使用NMake命令在CLI中设置调试或发布?
  4. 这是我的 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
    

    由于

1 个答案:

答案 0 :(得分:2)

我对nmake或cmake nmake生成器知之甚少,但如果它与makefile生成器类似,那么你所有三个问题的答案都是“你不能”。

对于第一个问题,Visual Studio(根据我的理解)不支持多种体系结构,它支持构建类型;当然,cmake生成的Visual Studio项目文件无法做到。

对于第二个问题,cmake生成的makefile不支持构建类型,我假设nmake具有相同的限制。我希望这只是cmake makefile生成器的一个限制; makefile中没有固有的原因,无法支持

类似于第三个问题,因为你不能用makefile / nmake输出支持多个构建类型,你当然不能选择在命令行上构建哪个构建类型。

所有这些问题的答案是,您必须使用不同的标志重新运行cmake以选择不同的选项(架构和构建类型)。

如果您关注的是不必清理工作区并且每次都从头开始重新配置它而丢失以前的工作,那么您应该查看cmake的源外构建功能。基本上,而不是使用:

cmake .

你使用类似的东西:

mkdir obj-x86
cd obj-x86
cmake ..

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

您在每个不同配置的不同目录(不必是子目录)中运行cmake。它们都可以共享相同的源树。有时当你第一次尝试这个时,你会发现你的cmake文件中的问题,他们假设一个特定的工作目录等,你可能需要更新它们以使用像CMAKE_SOURCE_DIR这样的变量而不是相对路径。