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#
  • 相关阅读:
    leetcode 122. Best Time to Buy and Sell Stock II
    leetcode 121. Best Time to Buy and Sell Stock
    python 集合(set)和字典(dictionary)的用法解析
    leetcode 53. Maximum Subarray
    leetcode 202. Happy Number
    leetcode 136.Single Number
    leetcode 703. Kth Largest Element in a Stream & c++ priority_queue & minHeap/maxHeap
    [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
    正则表达式
    十种排序算法
  • 原文地址:https://www.cnblogs.com/gr-nick/p/4128766.html
Copyright © 2011-2022 走看看