设为首页 加入收藏

TOP

Cmake 设置交叉编译环境
2014-11-24 00:58:15 来源: 作者: 【 】 浏览:3
Tags: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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++中函数占位符在函数重载中的作.. 下一篇Linux C中如何定义可变参数的宏

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: