### cmake使用

点击查看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_DIRhello_SOURCE_DIR,同时分别有两个等价的变量PROJECT_BINARY_DIRPROJECT_SOURCE_DIR

message命令可以输出信息。

add_executable生成可执行文件。

add_library 生成一个静态库文件libhello.a,如果修改STATICSHARED,则会生成动态库文件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_MAKEFILEon.

二、Reference

  1. http://blog.csdn.net/dbzhang800/article/details/6314073
  2. http://blog.csdn.net/dbzhang800/article/details/6329068
  3. http://blog.csdn.net/dbzhang800/article/details/6329314#
原文地址:https://www.cnblogs.com/gr-nick/p/4128766.html