沈雅

努力,以不负沈雅之名!
嵌入式、Linux、Cosplay、Acg、动漫、各种文学 全为我所爱矣!
交流联系:QQ88459122

Cmake 设置交叉编译环境

我用的是合众达的dm6446.

一  首先安装CMAKE

下载cmake 然后解压缩,进入解压缩后的目录,依次执行

# ./bootstrap
# make && make install

安装过程需要几分钟。

二 构建交叉编译的CMakeLists.txt

说明:

 

设置交叉编译之前,必须在CMakeList.txt前面加上这样一句,这样CMake才会认为你是要交叉编译:

SET(CMAKE_SYSTEM_NAME Linux)

 

在通知CMake要交叉编译以后,还要告诉CMake到哪个路径下去找库文件,因为在交叉编译的时候CMake是不会自动去系统默认的目录找库文件和头文件的:

 

SET(CMAKE_FIND_ROOT_PATH "编译器环境路径")

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

  其中的第一行,是告诉CMake查找的根目录是什么。后面分别是告诉CMake怎么查找编译时候的工具程序的位置、库的位置和头文件的位置。设置为NEVER表示不查找,设置为ONLY表示只在CMAKE_FIND_ROOT_PATH设定的目录下查找,设置为BOTH(这是默认选项)表示既可以在系统目录下查找,也可以在CMAKE_FIND_ROOT_PATH下查找。因为咱们是交叉编译,所以后两项的设置了ONLY,对于编译时调用工具,一般来说是需要在系统目录下查找的,不过我不需要所以设置为NEVER。

  然后,设置编译器:

 

SET(CMAKE_C_COMPILER "编译器环境路径")

  直接把编译器的路径设置过去就可以了,CMAKE_C_COMPILER是C语言编译器,CMAKE_CXX_COMPILE是C++语言编译器。

 

所以 在工程主CMakeLists.txt 中首先加入如下:

SET(CMAKE_SYSTEM_NAME Linux) 
SET(TOOLCHAIN_DIR "/opt/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le")
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm_v5t_le-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm_v5t_le-g++)

三 生成可调试版本的程序

1使用CMAKE编译确实很方便。但CMAKE默认编译出来的程序不带有符号文件,用GDB无法调试。

2 要编译时产生符号文件供调试,调用CMAKE时,带上 -DCMAKE_BUILD_TYPE=Debug

例如:在build文件中输入:

cmake .. -DCMAKE_BUILD_TYPE=Debug

这样产生的makefile文件make生成的可执行文件就带有调试信息,供gdb和gdbserver使用了。

*****另外有另一种更好的方法是在工程主CMakeLists.txt中的PROJECT语句后加入一句

SET(CMAKE_BUILD_TYPE Debug)

CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo 和 MinSizeRel。当这个变量值为 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成 Makefile ,当这个变量值为 Release 的时候,工程会使用变量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 选项生成 Makefile。

CMake 需要重点记住的命令和量

一  MESSAGE 命令

MESSAGE(STATUS "THIS IS A BINARY DIR" ${HELLO_BINARY_DIR})

STATUS 表示将要输出前缀为“--”的信息,可以替换为

FATAL_ERROR:立即终止CMake过程

SEND_ERROR:产生错误,生成过程被跳过

二 IF 与ELSEIF 、ELSE、ENDIF

示例:

IF(表达式)

ELSEIF(表达式)

ELSE(表达式)

ENDIF


评论

© 沈雅 | Powered by LOFTER