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 - 调试/交叉构建?的主要内容,如果未能解决你的问题,请参考以下文章
qt creator创建cmake构建的程序,无法启动调试(点左下角运行不出结果 No executable specified.)