cmake使⽤⽅法详解(转载)
cmake 简介
CMake是⼀个跨平台的安装(编译)⼯具,可以⽤简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project ⽂件,能编译器所⽀持的C++特性,类似UNIX下的automake。
CMake 使⽤⽅法
CMake的所有的语句都写在⼀个叫:的⽂件中。当⽂件确定后,可以⽤ccmake命令对相关的变量值进⾏配置。这个命令必须指向所在的⽬录。配置完成之后,应⽤cmake命令⽣成相应的makefile(在Unix like系统下)或者 project⽂件(指定⽤window下的相应编程⼯具编译时)。
其基本操作流程为:
1. $> ccmake directory
2. $> cmake directory
3. $> make
其中directory为所在⽬录;
第⼀条语句⽤于配置编译选项,如VTK_DIR⽬录,⼀般这⼀步不需要配置,直接执⾏第⼆条语句即可,但当出现错误时,这⾥就需要认为配置了,这⼀步才真正派上⽤场;
第⼆条命令⽤于根据⽣成Makefile⽂件;
第三条命令⽤于执⾏Makefile⽂件,编译程序,⽣成可执⾏⽂件;
CMake的执⾏就是这么简单,其难点在于如何编写⽂件,下⾯结合例⼦简单介绍的编写,看下⾯这个
1. #project name
2. PROJECT(test_math)
3. #head file path
4. INCLUDE_DIRECTORIES(
5. include
6. )
7. #source directory
8. AUX_SOURCE_DIRECTORY(src DIR_SRCS)
9. #set environment variable
10. SET(TEST_MATH
11. ${DIR_SRCS}
12. )
13. #set extern libraries
14. SET(LIBRARIES
15. libm.so
16. )
17. #add executable file
18. ADD_EXECUTABLE(../bin/bin ${TEST_MATH})
19. #add link library
20. TARGET_LINK_LIBRARIES(../bin/bin ${LIBRARIES})
21.
或者⽤下⾯这个
[cpp]
1. #project name
2. PROJECT(test_math)
3.
4. add_definitions("-Wall -lpthread -g")
5.
6. #head file path
7. INCLUDE_DIRECTORIES(
8. include
9. )
10.
11. #source directory
12. AUX_SOURCE_DIRECTORY(src DIR_SRCS)
13.
14. #set environment variable
15. SET(TEST_MATH
16. ${DIR_SRCS}
17. )
18.
19. #set extern libraries
20. SET(LIBRARIES
21. libm.so
22. )
23.
24. # set output binary path
25. SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
26.
27. SET(FS_BUILD_BINARY_PREFIX "Yfs")
28.
29. #add executable file
30. ADD_EXECUTABLE(${FS_BUILD_BINARY_PREFIX}sqrt ${TEST_MATH})
31.
32. #add link library
33. TARGET_LINK_LIBRARIES(${FS_BUILD_BINARY_PREFIX}sqrt ${LIBRARIES})
这是⼀个测试数学函数的程序的,"#"后⾯为注释的内容,CMake的命令全部为⼤写
第2⾏指定⽣成的⼯程名为test_math
第4⾏指定头⽂件⽬录为include
第8⾏指定源⽂件⽬录为src,并将其赋值给环境变量DIR_SRCS
第10⾏设定环境变量TEST_MATH的值为环境变量DIR_SRCS的值,此处⽤于显⽰如何⽤环境变量对环境变量进⾏赋值第14⾏将数学函数库赋值给环境变量LIBRARIES,当然,可以不⽤这个环境变量,⽽在后⾯直接使⽤该库名
第18⾏⽤于指定⽣成⽂件,将环境变量TEST_MATH⽬录下的所有⽂件编译⽣成../bin⽬录下的可执⾏⽂件bin
第20⾏指定../bin/bin执⾏时的链接库为环境变量LIBRARIES的值-libm.so
下⾯给出源⽂件
/src/main.c:
1. #include<stdio.h>
2. #include"../include/a.h"
3. int main()
4. {
5. double b=25.0;
6. double a=0.0;
7. a=get_sqrt(b);
8.
9. ("a is %lf, b is %lf\n",a,b);
10. return 0;
11. }
12.
/src/a.c
1. #include"../include/a.h"
2. double get_sqrt(double var1)
3. {
4. return sqrt(var1);
5. }
6.
/include/a.h
#ifndef A_FILE_HEADER_INC
1.
2. #define A_FILE_HEADER_INC
3. #include<math.h>
4.
5. double get_sqrt(double var1);
6.
7. #endif
将放在当前⽬录下,执⾏
1. $> cmake .
2. $> make
即可⽣成可执⾏⽂件,在⽬录/bin下的bin⽂件,好了运⾏看其效果是否和所想⼀样。
====================
补充:
⼀、基本使⽤
安装:下载⼆进制包后可直接解压使⽤
从源码安装则执⾏命令:./bootstrap; make; make install——尝试执⾏bootstrap失败
使⽤:cmake dir_path,⽣成⼯程⽂件或makefile⽂件
⼆、概念
out-of-source build,与in-source build相对,即将编译输出⽂件与源⽂件放到不同⽬录中;
三、基本结构
1,依赖⽂件,项⽬主⽬标⼀个,主⽬录中可指定包含的⼦⽬录;
2,在项⽬中使⽤project指定项⽬名称,add_subdirectory添加⼦⽬录
3,⼦⽬录将从⽗⽬录继承设置(TBD,待检验)
四、语法
1. #注释
2. 变量:使⽤set命令显式定义及赋值,在⾮if语句中,使⽤${}引⽤,if中直接使⽤变量名引⽤;后续的set命令会清理变量原来的值;
3. command (args ...) #命令不分⼤⼩写,参数使⽤空格分隔,使⽤双引号引起参数中空格
4. set(var a;b;c) <=> set(var a b c) #定义变量var并赋值为a;b;c这样⼀个string list
5. Add_executable(${var}) <=> Add_executable(a b c) #变量使⽤${xxx}引⽤
6. 条件语句:
if(var) #var ⾮empty 0 N No #⾮运算使⽤NOT
…
else()/elseif() … endif(var)
7. 循环语句
Set(VAR a b c)
Foreach(f ${VAR}) …Endforeach(f)
8. 循环语句
WHILE() … ENDWHILE()
五、内部变量
CMAKE_C_COMPILER:指定C编译器
CMAKE_CXX_COMPILER:
CMAKE_C_FLAGS:编译C⽂件时的选项,如-g;也可以通过add_definitions添加编译选项EXECUTABLE_OUTPUT_PATH:可执⾏⽂件的存放路径
LIBRARY_OUTPUT_PATH:库⽂件路径
CMAKE_BUILD_TYPE::build 类型(Debug, Release, ...),CMAKE_BUILD_TYPE=Debug BUILD_SHARED_LIBS:Switch between shared and static libraries
内置变量的使⽤:
>> 在中指定,使⽤set
>> cmake命令中使⽤,如cmake -DBUILD_SHARED_LIBS=OFF
六、命令
project (HELLO) #指定项⽬名称,⽣成的VC项⽬的名称;
>>使⽤${HELLO_SOURCE_DIR}表⽰项⽬根⽬录
include_directories:指定头⽂件的搜索路径,相当于指定gcc的-I参数
>> include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello为include⽬录
link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数
>> link_directories (${HELLO_BINARY_DIR}/Hello) #增加Hello为link⽬录
add_subdirectory:包含⼦⽬录
>> add_subdirectory (Hello)
add_executable:编译可执⾏程序,指定编译,好像也可以添加.o⽂件
>> add_executable ( ) #将cxx编译成可执⾏⽂件——add_definitions:添加编译参数
>> add_definitions(-DDEBUG)将在gcc命令⾏添加DEBUG宏定义;
>> add_definitions( “-Wall -ansi –pedantic –g”)
target_link_libraries:添加链接库,相同于指定-l参数
>> target_link_libraries(demo Hello) #将可执⾏⽂件与Hello连接成最终⽂件demo
add_library:
>> add_library() #将编译成静态库如libHello.a
add_custom_target:
message( status|fatal_error, “message”):
set_target_properties( ... ): lots OUTPUT_NAME, VERSION, ....
link_libraries( lib1 lib2 ...): All targets link with the same set of libs
七、说明
1,CMAKE⽣成的makefile能够处理好.h⽂件更改时只编译需要的cpp⽂件;
⼋、 FAQ
1)怎样获得⼀个⽬录下的所有源⽂件
>> aux_source_directory(<dir> <variable>)
>> 将dir中所有源⽂件(不包括头⽂件)保存到变量variable中,然后可以add_executable (ss7gw ${variable})这样使⽤。
2)怎样指定项⽬编译⽬标
>> project命令指定
3)怎样添加动态库和静态库
>> target_link_libraries命令添加即可
4)怎样在执⾏CMAKE时打印消息
>> message([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
>> 注意⼤⼩写
5)怎样指定头⽂件与库⽂件路径
>> include_directories与link_directories
>>可以多次调⽤以设置多个路径
>> link_directories仅对其后⾯的targets起作⽤
6)怎样区分debug、release版本
>>建⽴debug/release两⽬录,分别在其中执⾏cmake -DCMAKE_BUILD_TYPE=Debug(或Release),需要编译不同版本时进⼊不同⽬录执⾏make即可;
Debug版会使⽤参数-g;Release版使⽤-O3 –DNDEBUG
>> 另⼀种设置⽅法——例如DEBUG版设置编译参数DDEBUG
IF(DEBUG_mode)
add_definitions(-DDEBUG)
ENDIF()
在执⾏cmake时增加参数即可,例如cmake -D DEBUG_mode=ON
7)怎样设置条件编译
例如debug版设置编译选项DEBUG,并且更改不应改变
>> 使⽤option command,eg:
option(DEBUG_mode "ON for debug or OFF for release" ON)
IF(DEBUG_mode)
add_definitions(-DDEBUG)
ENDIF()
>> 使其⽣效的⽅法:⾸先cmake⽣成makefile,然后make edit_cache编辑编译选项;下会打开⼀个⽂本框,可以更改,该完后再make⽣成⽬标⽂件——emacs不⽀持make edit_cache;
>> 局限:这种⽅法不能直接设置⽣成的makefile,⽽是必须使⽤命令在make前设置参数;对于debug、release版本,相当于需要两个⽬录,分别先cmake⼀次,然后分别make edit_cache⼀次;
cmake如何使用
>> 期望的效果:在执⾏cmake时直接通过参数指定⼀个开关项,⽣成相应的makefile——可以这样做,例如cmake –DDEBUGVERSION=ON
8)怎样添加编译宏定义
>> 使⽤add_definitions命令,见命令部分说明
9)怎样添加编译依赖项
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论