天天看點

CmakeList 組織編譯項目的基本用法基本語句

基本語句

外部編譯源碼

  • 文檔結構
    --projecct
       --main.cpp
       --class1.cpp
       --class1.h
       --Cmakelist.txt     
       --build
               
  • 項目名

PROJECCT(hello)

  • 版本說明

    CMAKE_MINIMUM_REQUIRED(VERSION 3.2)

  • 編譯可執行檔案

    ADD_EXECUTABLE(hello main.cpp class1.cpp)

  • 或者用變量指定源檔案

    SET(SRC_LIST main.cpp class1.h class1.cpp)

    ADD_EXECUTABLE(hello SRC_LIST)

    或者

    SET(SOURCE_FILES main.cpp class1.h class1.cpp)

    ADD_EXECUTABLE(hello SOURCE_FILES)

  • 消息提示添加

    MESSAGE(STATUS “this is BINARY dir ” ${PROJECT_BINARY_DIR})

    MESSAGE(STATUS “this is SOURCE dir ” ${PROJECT_SOURCE_DIR})

    其中

    PROJECT_BINARTY_DIR

    也可以寫作

    HELLO_BINARY_DIR

    ,是build後存放二進制可執行檔案的路徑。

    其中

    PROJECT_SOURCE_DIR

    也可以寫作

    HELLO_SOURCE_DIR

    ,是項目路徑。
  • 編譯過程
    cd ~/project
    mkdir build
    cd build
    cmake ..
    make
               

    ..

    是父級目錄;

    .

    是目前目錄

    cmake後build裡會生成 makefile 檔案

    make 後生成 hello.bin

    ./hello 運作程式

    清理工作:make clean

編譯靜/動态庫

簡單靜态庫

假設想要生成一個靜态庫libclass.a

  • 文檔結構
    --project
    --main.cpp
    --class.cpp
    --class.h
    --Cmakelist.txt
    --build
               
  • CmakeList.txt如下
    PROJECT(HELLO)
    CMAKE_MINIMUM_REQUIRED(VERSION )
    ADD_EXECUTABLE(hello hello.cpp)
    ADD_LIBRARY(class class.cpp)
               
    其中

    ADD_LIBRARY(class class.cpp)

    可以用下面等代碼替換

    SET(LIBCLASS_SRC hello.cpp)

    ADD_LIBRARY(class ${LIBCLASS_SRC})

生成動态庫

  • 文檔結構
--projecct
     --lib
       --hello.cpp
       --hello.h
       --CmakeList.txt
     --CmakeList.txt
     --build
           
  • project檔案夾下的CmakeList如下
    PROJECT(hellolib)
    ADD_SUBDIRECTORY(lib)
               
  • lib檔案夾下的CmakeList如下
    SET(LIBHELLO_SRC class.cpp)
    ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})添加
               
    編譯後會在build/lib/下生成 libhello.so
  • 語句

    ADD_LIBRARY(libname[SHARED|STATIC|MODULE][EXCLUDE_FROM_ALL]source1 source2 ...)

    SHARED –動态庫

    STATIC –靜态庫

  • 指定動态庫生成的位置

    可以在主工程的CmakeList.txt中添加一行

    SET(LIBRARY_OUTPUT_PATH <path_to_lib>)

同時生成同名的靜态庫與動态庫

  • 在上面的動态庫工程中,如果在

    ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

    後添加

    ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})

    發現build/lib/下隻有靜态庫 libhello.a
    這是因為hello作為一個target是不能重命名的
  • ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})

    改成

    ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})

    重新編譯。可以得到

    libhello.so

    libhello_static.a

  • 為了得到同名的靜态庫和動态庫,用指令:

    SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)

    在lib/CmakeList.txt中這麼寫:
    SET(LIB_SRC hello.cpp hello.h)
    ADD_LIBRARY(hello SHARED ${LIB_SRC})
    ADD_LIBRARY(hello_static STATIC ${LIB_SRC})
    SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
               
    重新編譯就可以得到 libhello.so 和 libhello.a 兩個庫。
  • cmake 在建構一個新的 target 時,會嘗試清理掉其他使用這個名字的庫,因為,在建構 libhello.a 時,

    就會清理編譯前已經存在的 libhello.so。如果分批編譯,又要防止同名庫被清理,可以在lib/CmakeList.txt中添加:

    SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT )
    SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT )
               

使用外部庫和頭檔案

以手動添加OPENCV為例子:

頭檔案路徑

/usr/local/include

也可以通過 ~/.bashrc 添加

opencv常用的庫 libopencv_core.so libopencv_highgui.so libopencv_imgproc.so

  • 檔案結構
    --project
    --src
      --main.cpp
      --CmakeList.txt
    --CmakeList.txt
    --build
               
  • project/CmakeList.txt:
    PROJECT(main)
    ADD_SUBDIRECTORY(src)
               
  • src/CmakeList.txt:
    ADD_EXECUTABLE(main main.cpp)
    INCLUDE_DIRECTORIES(/usr/local/include/)
    TARGET_LINK_LIBRARIES(main /usr/local/lib/libopencv_core.so)
               

添加頭檔案搜尋目錄

INCLUDE_DIRECTORIES(/usr/local/include)
           

添加庫搜尋目錄

LINK_DIRECTORIES(/usr/local/opencv/lib)
           

添加外部庫連結

target_link_libraries(main /usr/local/lib/libopencv_core.so usr/local/lib/libopencv_highgui.so  /usr/local/lib/libopencv_imgproc.so)
           

TARGET_LINK_LIBRARIES(main hello)

也可以寫成

TARGET_LINK_LIBRARIES(main libhello.so)

使用FIND_PACKAGES 添加 OPENCV

cmake_minimum_required(VERSION .)
project(heatmap)
set(CMAKE_CXX_STANDARD )
set(SOURCE_FILES main.cpp heat.cpp heat.h)

find_package(OpenCV REQUIRED)
set(OpenCV_FOUND TRUE CACHE BOOL "" FORCE)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(heatmap ${OpenCV_LIBS})

add_executable(heatmap ${SOURCE_FILES})
           

繼續閱讀