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})


0 0
原创粉丝点击