【问题标题】:CMAKE - Debug / Crossbuild?CMAKE - 调试/交叉构建?
【发布时间】:2011-08-16 14:36:38
【问题描述】:

好的,我使用 CMake 在 Linux 下为 ARM 目标构建 C++。我的一个名为 DEBUG 的 .h 文件中有一个#DEFINE。如果设置,我希望将各种用于跟踪串行的方法添加到构建中。我希望能够通过这样做来做到这一点,例如使用此#DEFINE 集构建“make debug”,并在不设置它的情况下进行正常的“make”构建。这可能吗?

另外,是否可以为 CMake 指定目标?因为我现在有 2 个 CMakeLists.txt,一个用于 x86,一个用于 Armel(与 ARM 相比,它具有不同的选项,例如在 x86 上使用调试信息进行构建,而 ARM 则需要一个剥离的、大小优化的二进制文件)。

【问题讨论】:

标签: c++ makefile x86 cmake arm


【解决方案1】:

看来你有两个问题。一个关于调试,你可以使用CMAKE_BUILD_TYPE来分离你的调试/发布设置,并使用$ cmake --build . --config Release$ cmake --build . --config Debug编译。

第二,关于交叉构建,这是可能的。你可以这样做:

  1. 根据this guide分别为arm和x86编写配置文件来设置编译器、归档器等。假设x86的一个命名为*config_x86.cmake*和*config_arm.cmake* for arm。
  2. 定义一个 cmake 宏,例如 *MY_TARGET*。并在project命令前添加如下代码,

    if (${MY_TARGET} STREQUAL "x86")
        include(config_x86.cmake REQUIRED)
    elseif (${MY_TARGET} STREQUAL "arm")
        include(config_arm.cmake REQUIRED)
    endif ()
    
  3. 然后像这样生成你的项目文件

    $ cmake -DMY_TARGET=x86 "你的代码目录"

【讨论】:

  • 我使用了这个,并使用例如在标题中设置#define的值CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/src/flags.h.cmake ${CMAKE_SOURCE_DIR}/src/flags.h)
【解决方案2】:

CMake 开箱即用地支持调试和发布版本。

假设您的项目的顶级 CMakeLists.txt 在 ~/project/foobar 中,您可以通过执行以下操作创建单独的调试和发布版本:

mkdir ~/project/build

mkdir ~/project/build/foobar-debug 
cd ~/project/build/foobar-debug 
cmake -DCMAKE_BUILD_TYPE:STRING=Debug ~/project/foobar 

mkdir ~/project/build/foobar-rel
cd ~/project/build/foobar-rel
cmake -DCMAKE_BUILD_TYPE:STRING=Release ~/project/foobar 

更好的是,CMake 不仅支持您可能习惯的标准调试/发布目标,而且还支持最小大小的发布,以及带有调试信息的发布。在以下位置查看 CMAKE_BUILD_TYPE 的其他选项: http://cmake.org/Wiki/CMake_Useful_Variables

【讨论】:

    【解决方案3】:

    关于定义,你可以在你的 CMakeLists.txt 文件中做你想做的事情:

    if( CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]" )
        message( "INFO: DEBUG BUILD" )
        # for debug type builds, turn on verbose makefiles
        SET(CMAKE_VERBOSE_MAKEFILE ON)
    
        # Tell other CMake files that we're doing a debug build
        SET( DEBUG_BUILD 1 )
    
        # Tell C/C++ that we're doing a debug build
        ADD_DEFINITIONS( -DDEBUG )
    endif()
    
    if( CMAKE_BUILD_TYPE MATCHES "[Rr][Ee][Ll][Ee][Aa][Ss][Ee]" )
        message( "INFO: RELEASE BUILD" )
    endif()
    

    CMake 不喜欢在同一个构建树中支持两个目标,即两个工具链。反正这个真的没必要。对于每个可能的目标,绝对使用带有一个构建树的树外构建。像这样的:

    cd /path/to/x86_build
    cmake /path/to/src/x86/CMakeLists.txt
    cd /path/to/Armel_build
    cmake /path/to/src/Armel/CMakeLists.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多