cmake取消宏定义_cmake使⽤⽅法详解(转载)
CMake是⼀个跨平台的安装(编译)⼯具,可以⽤简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project ⽂件,能测试编译器所⽀持的C++特性,类似UNIX下的automake。
CMake 使⽤⽅法
CMake的所有的语句都写在⼀个叫:的⽂件中。当⽂件确定后,可以⽤ccmake命令对相关 的变量值进⾏配置。这个命令必须指向所在的⽬录。配置完成之后,应⽤cmake命令⽣成相应的makefile(在Unix like系统下)或者 project ⽂件(指定⽤window下的相应编程⼯具编译时)。
其基本操作流程为:
$> ccmake directory
$> cmake directory
$> make
其中directory为所在⽬录;
第⼀条语句⽤于配置编译选项,如VTK_DIR⽬录 ,⼀般这⼀步不需要配置,直接执⾏第⼆条语句即可,但当出现错误时,这⾥就需要认为配置了,这⼀步才真正派上⽤场;
第⼆条命令⽤于根据⽣成Makefile⽂件;
第三条命令⽤于执⾏Makefile⽂件,编译程序,⽣成可执⾏⽂件;
CMake的执⾏就是这么简单,其难点在于如何编写⽂件,下⾯结合例⼦简单介绍的编写,看下⾯这个
#project name
PROJECT(test_math)
#head file path
INCLUDE_DIRECTORIES(
include
)
#source directory
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#set environment variable
SET(TEST_MATH
${DIR_SRCS}
)
#set extern libraries
SET(LIBRARIES
libm.so
)
#add executable file
#add link library
TARGET_LINK_LIBRARIES(../bin/bin ${LIBRARIES})
或者⽤下⾯这个
#project name
PROJECT(test_math)
add_definitions("-Wall -lpthread -g")
#head file path
cmake如何使用INCLUDE_DIRECTORIES(
include
)
#source directory
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#set environment variable
SET(TEST_MATH
${DIR_SRCS}
)
#set extern libraries
SET(LIBRARIES
libm.so
)
# set output binary path
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(FS_BUILD_BINARY_PREFIX "Yfs")
#add executable file
ADD_EXECUTABLE(${FS_BUILD_BINARY_PREFIX}sqrt ${TEST_MATH})
#add link library
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,当然,可以不⽤这个环境变量,⽽在后⾯直接使⽤该库名
第20⾏指定../bin/bin执⾏时的链接库为环境变量LIBRARIES的值-libm.so
下⾯给出源⽂件
/src/main.c:
#include
#include"../include/a.h"
int main()
{
double b=25.0;
double a=0.0;
a=get_sqrt(b);
printf("a is %lf, b is %lf\n",a,b);
return 0;
}
/src/a.c
#include"../include/a.h"
double get_sqrt(double var1)
{
return sqrt(var1);
}
/include/a.h
#ifndef A_FILE_HEADER_INC
#define A_FILE_HEADER_INC
#include
double get_sqrt(double var1);
#endif
将放在当前⽬录下,执⾏
$> cmake .
$> make
即可⽣成可执⾏⽂件,在⽬录/bin下的bin⽂件,好了运⾏看其效果是否和所想⼀样。====================
补充:
⼀、 基本使⽤
安装:下载⼆进制包后可直接解压使⽤
使⽤: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中,然后可以add_executable (ss7gw ${variable})这样使⽤。
2) 怎样指定项⽬编译⽬标
>> project命令指定
3) 怎样添加动态库和静态库
>> target_link_libraries命令添加即可
4) 怎样在执⾏CMAKE时打印消息
>> message([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论