• ### 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#
  • 相关阅读:
    数据库函数(备忘)
    C语言实现统计字符个数
    用链表做一个学生管理系统
    深入理解 JSON
    从 JDK 源码角度看 Object
    eclipse + maven搭建SSM框架
    Oracle12c版64位客户端安装步骤(32位安装步骤一样)
    Oracle12C版本安装步骤
    ArcGIS破解配置及oracle文件配置
    ArcGIS_Lisence安装步骤
  • 原文地址:https://www.cnblogs.com/gr-nick/p/4128766.html
Copyright © 2020-2023  润新知