点击查看Evernote原文。
#@author: gr
#@date: 2014-11-24
#@email: forgerui@gmail.com
记录下cmake一些知识,方便以后查看。
一、Contents
1. cmake初识
cmake
寻找CMakeLists.txt文件开始配置,如下:
#CMakeLists.txt
# 要求最低的cmake版本
cmake_minimum_required(VERSION 2.8)
# 工程名
project(test)
# 把当前目录下的源文件名赋值给SRC_LIST变量
aux_source_directory(. SRC_LIST)
# 利用源文件生成可执行文件名test
add_executable(test ${SRC_LIST})
这是一个比较简单的cmakelists文件,注释解释了各个语句的作用。cmake的命令是不区分大小写的,但其中的变量是区分大小写的。
2. 运行cmake
一般会新建一个build
目录,进入这个目录,运行cmake ../
目录可以生成Makefile
文件,之后可以运行make && make install
编译、安装。
3. CMakeLists.txt中常用命令
project
命令不是必需,使用它会引入两个变量hello_BINARY_DIR
和 hello_SOURCE_DIR
,同时分别有两个等价的变量PROJECT_BINARY_DIR
和 PROJECT_SOURCE_DIR
。
message
命令可以输出信息。
add_executable
生成可执行文件。
add_library
生成一个静态库文件libhello.a
,如果修改STATIC
为SHARED
,则会生成动态库文件libhello.so
。
add_library(hello STATIC $HELLO_LIST)
target_link_libraries(test hello)
生成可执行文件时需要的库文件。
4. 子目录
如果源文件包含子目录,那么必须在顶层的CMakeLists.txt
中添加add_subdirectory(hello/)
命令。
其次,在hello子目录中还需要新建一个CMakeLists.txt
文件,其中生成子文件目录下源代码的库文件。
#./CMakeLists.txt
project(test)
add_subdirectory(hello/)
#aux_source_directory(. SRC_LIST)
set(SRC_LIST main.cpp)
add_executable(test ${SRC_LIST})
target_link_libraries(test hello)
#./hello/CMakeLists.txt
#aux_source_directory(. HELLO_SRC_LIST)
set(HELLO_SRC_LIST hello.cpp)
add_library(hello STATIC ${HELLO_SRC_LIST})
5. 设置生成文件的输出目录
比如,想使可执行文件放到bin
下,库文件放到lib
下,那么可以设置其属性值。
#设置可执行程序输出目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
#设置库文件输出位置
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
6. 多平台支持
#hello/hello.h
#ifndef DBZHANG_HELLO_
#define DBZHANG_HELLO_
#if defined _WIN32
#if LIBHELLO_BUILD
#define LIBHELLO_API __declspec(dllexport)
#else
#define LIBHELLO_API __declspec(dllimport)
#endif
#else
#define LIBHELLO_API
#endif
LIBHELLO_API void hello(const char* name);
#endif //DBZHANG_HELLO_
#hello/CMakeLists.txt
set(LIB_SRC hello.cpp)
add_definitions("-DLIBHELLO_BUILD")
add_library(libhello SHARED ${LIB_SRC})
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
7. 使用finder
find_package(CURL)
if(CURL_FOUND)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(curltest ${CURL_LIBRARY})
else(CURL_FOUND)
message(FATAL_ERROR "curl not found!")
endif(CURL_FOUND)
7. others
为了得到更多出错信息可以SET( CMAKE_VERBOSE_MAKEFILE on )
。设置变量CMAKE_VERBOSE_MAKEFILE
为 on
.