CMake简单使用参考
来源:互联网 发布:软件发短信 编辑:程序博客网 时间:2024/05/17 19:59
为了使用CMake,简单了解了一下,能应付简单的程序编译需求,特此记录
1 在默认的情况下,CMake 生成的 makefile 只会显示编译的进度,并不会把各步骤实际调用的命令、参数一一列出,但在很多时候我们需要确知编译时倒底使用了哪些编译选项。
其中一个方法是直接在 CMakeList.txt 当中加入这一行
set(CMAKE_VERBOSE_MAKEFILE ON)
不过若是我们不希望更动 CMakeList.txt,可以等到执行时再加入选项(显示编译选项)
cmake -DCMAKE_VERBOSE_MAKEFILE=ON ...options...
make
或
cmake ...options...
$ make VERBOSE=1
2 默认的编译组态
透过指定 CMAKE_BUILD_TYPE 变量即可改变编译组态,默认的 CMAKE_BUILD_TYPE 是 None,即不加上任何额外编译选项。内建的 CMAKE_BUILD_TYPE 支援以下几种组态:
None : 编译器默认值
Debug : 产生除错资讯
Release : 进行执行速度最佳化
RelWithDebInfo : 进行执行速度最佳化,但仍然会启用 debug flag
MinSizeRel : 进行程式码最小化
虽然 CMAKE_BUILD_TYPE 可以由 CMakeList.txt 设定,一般来说我们更偏好到了执行 CMake 时才由命令列指定。
编译Release版,默认使用:-O3 -DNDEBUG,执行命令: cmake -DCMAKE_BUILD_TYPE=Release .
编译Debug版,默认使用:-g,执行命令: cmake -DCMAKE_BUILD_TYPE=Debug .
make VERBOSE=1 可看到每个编译单元都带有“-O3 -DNDEBUG”选项编译Release。对 Debug 也可比照办理。
3 set 命令用来设置变量
add_exectuable 告诉工程生成一个可执行文件。
add_library 则告诉生成一个库文件。
通过message来输出变量的值:message(${PROJECT_SOURCE_DIR})
注意:CMakeList.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的。
4 编译最好是不在代码所在目录下编译,否则会产生一堆中间文件,看起来很乱,建议在源码目录下创建build目录,
在build目录下执行"cmake ..",然后make ,和在源码目录执行"cmake ."再执行"make"效果一样,唯一的区别是bin目录是build的子目录
5 总结:CMakeFile.txt模板
1) 编译可执行程序模板***************************************************************************************************
#工程名
PROJECT(prj_name)
#最小版本要求
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(CMAKE_SOURCE_DIR .)
# 用于编译debug版的编译选项:带调试信息
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -o0 -Wall -g -ggdb")
#用于编译release版的编译选项:带调试信息
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -o3 -Wall -DNDEBUG")
# AUX_SOURCE_DIRECTORY 将当前目录中的所有源文件名称赋值给变量 DIR_SRCS
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
#设置可执行程序输出目录,会自动建立bin目录,并把编译出的可执行文件放到bin目录下
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
# 使用命令 ADD_EXECUTABLE 指示变量 DIR_SRCS 中的源文件需要编译 成一个名称为 prj_name 的可执行文件
ADD_EXECUTABLE(prj_name ${DIR_SRCS})
#指定需要链接的库:lib1和lib2
TARGET_LINK_LIBRARIES(prj_name lib1 lib2)
编译Debug版: cmake -DCMAKE_BUILD_TYPE=Debug .
编译Release版: cmake -DCMAKE_BUILD_TYPE=Release .
2) 编译动态库模板***************************************************************************************************
#工程名
PROJECT(prj_name)
#最小版本要求
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(CMAKE_SOURCE_DIR .)
# 用于编译debug版的编译选项:带调试信息
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -o0 -Wall -g -ggdb")
#用于编译release版的编译选项:带调试信息
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -o3 -Wall -DNDEBUG")
# AUX_SOURCE_DIRECTORY 将当前目录中的所有源文件名称赋值给变量 DIR_SRCS
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
#指定需要链接的库:lib1和lib2
TARGET_LINK_LIBRARIES(prj_name lib1 lib2)
# 设置动态库输出目录,自动创建bin目录,并把编译结果输出到bin目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
#生成动态库
ADD_LIBRARY(prj_name SHARED ${DIR_SRCS})
***************************************************************************************************
小例子:例1,编译当前路径下的程序
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
printf ("hello world\n");
}
#工程名test1
PROJECT(test1)
#最小版本要求
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
#把当前目录中所有源文件名称赋值给DIR_SRCS变量
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
#使用ADD_EXECUTABLE指示变量DIR_SRCS中的所有源文件需要编译为一个名称为tets1的可执行文件
ADD_EXECUTABLE(test1 ${DIR_SRCS})
#使用说明:在当前目录执行"cmake ."执行cmake生成Makefile,再执行"make"即可编译出程序test1
例2:编译当前路径下的程序,使用src路径下的链接库libtest_lib.a
main.cpp文件内容
#include <stdio.h>
#include <stdlib.h>
#include "./src/test2.h"
int main(int argc, char * argv[])
{
int n = 0;
n = add(6, 2);
printf ("hello world! 1 + 2 = %d \n", n);
}
CMakeLists.txt内容
#工程名
PROJECT(test2)
#最小版本要求
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
#指明工程中包含一个子目录
ADD_SUBDIRECTORY(src)
# AUX_SOURCE_DIRECTORY 将当前目录中的所有源文件名称赋值给变量 DIR_SRCS
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
# 使用命令 ADD_EXECUTABLE 指示变量 DIR_SRCS 中的源文件需要编译 成一个名称为 test2 的可执行文件
ADD_EXECUTABLE(test2 ${DIR_SRCS})
# 使用命令 TARGET_LINK_LIBRARIES 指明可执行文件 test2 需要连接一个名为test_lib的链接库 。
TARGET_LINK_LIBRARIES(test2 test_lib)
./src/test2.h内容
int add(int n1, int n2);
./src/test2.cpp内容
#include "test2.h"
int add(int n1, int n2)
{
return n1 + n2;
}
./src/CMakeLists.txt内容
AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS)
ADD_LIBRARY(test_lib ${DIR_TEST1_SRCS})
- CMake简单使用参考
- CMake的简单使用
- CMake简单使用
- cmake 简单使用
- Cmake简单使用
- CMake简单使用
- Cmake参考
- cmake简单使用-生成库
- ubuntu下安装cmake及cmake简单使用
- ubuntu下安装cmake以及cmake的简单使用
- ubuntu下安装cmake及cmake简单使用
- cmake安装和使用简单介绍
- android studio中CMake的简单使用
- [CMake] CMake的使用
- 使用Cmake
- cmake使用
- CMake 使用
- cmake使用
- CentOS 6.2 64位 手动安装Apache 2.4.9
- linux 简单的命名管道
- htmlview屏蔽滚动条的问题
- 黑马程序员___集合2
- 六月过一旬了,下面剩下不到20天写个简短的计划吧
- CMake简单使用参考
- Python中的join和split
- 编译原理中FIRST集合与FOLLOW集合的算法
- JAVA中protected的作用
- 栈的应用--计算字符串表达式
- 关于VBO
- BeagleBone Black 之 NFS 的搭建配置
- jsp中获取当前文件路径
- C# step by step 学习笔记8 CHAPTER 9 使用枚举和结构创建值类型