zoukankan      html  css  js  c++  java
  • ### 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++语言实现
    十进制数转N进制c++实现
    字符单链表识别数字,字母,其它字符,并分为三个循环链表的算法c++实现
    c++两数组合并算法
    c++顺序表(数组)查找最大最小值
    SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析
    php实现单点登录,顶级域名与子域名间共享Cookie实现单点登录原理
    php实现单点登录实例
    php实现SSO单点登录实例
    玩转音频、视频的利器:FFmpeg
  • 原文地址:https://www.cnblogs.com/gr-nick/p/4128766.html
Copyright © 2011-2022 走看看