CMAKE - 调试/交叉构建?

Posted

技术标签:

【中文标题】CMAKE - 调试/交叉构建?【英文标题】:CMAKE - Debug / Crossbuild? 【发布时间】: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 则需要一个剥离的、大小优化的二进制文件)。

【问题讨论】:

标准礼仪是每个帖子只提出一个问题:meta.stackexchange.com/questions/39223/…,这样更直接地将答案标记为“已接受” 【参考方案1】:

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

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

    根据this guide分别为arm和x86编写配置文件来设置编译器、归档器等。假设x86的一个命名为*config_x86.cmake*和*config_arm.cmake* for arm。

    定义一个 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 ()
    

    然后像这样生成你的项目文件

    $ 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

【讨论】:

以上是关于CMAKE - 调试/交叉构建?的主要内容,如果未能解决你的问题,请参考以下文章

用于自定义调试构建的 CMake qt 输入库后缀

如何使用交叉编译的构建调试 Qt dll 问题?

CMake 标志更改调试配置

qt creator创建cmake构建的程序,无法启动调试(点左下角运行不出结果 No executable specified.)

使用 cmake 时未创建调试符号

用Eclipse和GDB构建ARM交叉编译和在线调试环境