CMake 学习笔记

变量的定义
有有两种情况,一种是显式的(使用set指令),另一种是隐式的,比如project指令,它会自动为你定义<projectname>_BINARY_DIR和<projectname>_SOURCE_DIR两个变量。

变量引用
通常情况下使用${变量名},在if等语句中,直接用变量名而不用${变量名}来取值

CMake常用变量
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR,这三个变量指的是工程编译发生的目录。

CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR,这三个变量指代的内容,不论采用何种编译方式,都是工程顶层目录。

CMAKE_CURRENT_SOURCE_DIR
当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIR

OPTION: provides an option that the user can optionally select.
    OPTION(<option_variable> "help string describing option" [initial value])
    实例:
        OPTION(OSG_BUILD_PLATFORM_ANDROID OFF)
        OPTION(OSG_BUILD_PLAFROM_IPHONE "EnableIPhoneSDK support" OFF)

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
向当前工程添加存放源文件的子目录source_dir,binary_dir指定存放编译输出文件的路径。
用法:add_subdirectory(src bin);
说明:bin为编译输出位置,src编译出来的可能是library或者executable等。

PROJECT_BINARY_DIR 编译发生的当前目录,比如build目录
EXECUTABLE_OUTPUT_PATH 可执行文件的输出目录
LIBRARY_OUTPUT_PATH 库文件的输出目录
用法:set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

mkdir -p dir/menu
说明:创建menu目录,如果当前目录下不存在dir目录则创建dir目录(即menu的父目录,-p代表parent)。

同时编译静态库和动态库,设置两个target:hello和hello_static,并通过set_target_properties修改target的输出名字(OUTPUT_NAME)
set(LIBHELLO_SRC hello.c)
add_library(hello SHARED ${LIBHELLO_SRC})
add_library(hello_static STATIC ${LIBHELLO_SRC})
set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")

动态库版本号
libhello.so.1.2
libhello.so -> libhello.so.1
libhello.so.1 -> libhello.so.1.2
set_target_properties(hello PROPERTIES VERSION 1.2 SOVERSION 1)
说明:VERSION 指代动态库版本,SOVERSION 指代API版本

安装
cmake -DCMAKE_INSTALL_PREFIX=./urs ..
install(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
install(FILES hello.h DESTINATION include/hello)
说明:安装target用install(TARGETS targets [[LIBRARY|ARCHIVE]] [DESTINATION <dir>]),;安装(头)文件用install(FILES files DESTINATION <dir>)

CMake基本指令
add_definitions(-DHAVE_OPENCL -DHAVE_SSE2 ...) 给C/C++ 编译器定义一些宏。
如果要添加其它的编译器开关,可以通过变量 CMAKE_C_FLAGS 和 CMAKE_CXX_FLAGS变量设置

add_dependencies(target-name depend-target1 depend-target2 ...) 定义target-name这个target的依赖项,以确保在编译该target之前,其它target已经被构建

添加第三方库
include_directories("/usr/include")
add_executable(curltest main.c)
target_link_libraries(curltest curl)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值