1. 程式人生 > >cmake用法回顧與總結

cmake用法回顧與總結

以前用cmake只是為了體驗下它的功能,過不久就忘記了,現在需要用它開發專案,需要總結並熟練它,特作總結如下,是關於ubuntu下使用cmake的方法。

(1)用cmake建立可執行檔案

1)單原始檔目錄

清單 1 原始檔 main.cpp

 #include<iostream>

 int main()  {
     std::cout<<"Hello word!"<<std::endl;
     return 0;
 }

CMakeLists.txt檔案與main.cpp放在同一目錄下

清單 2 CMakeLists.txt  

PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 
AUX_SOURCE_DIRECTORY(. DIR_SRCS) 
ADD_EXECUTABLE(main ${DIR_SRCS})

CMakeLists.txt 的語法比較簡單,由命令、註釋和空格組成,其中命令是不區分大小寫的,符號"#"後面的內容被認為是註釋。命令由命令名稱、小括號和引數組成,引數之間使用空格進行間隔。

例如對於清單2的 CMakeLists.txt 檔案:

第一行是一條命令,名稱是 PROJECT ,引數是 main ,該命令表示專案的名稱是 main 。

第二行的命令限定了 CMake 的版本。

第三行使用命令 AUX_SOURCE_DIRECTORY 將當前目錄中的原始檔名稱賦值給變數 DIR_SRCS 。 CMake 手冊中對命令 AUX_SOURCE_DIRECTORY 的描述如下:

aux_source_directory(<dir> <variable>) 

該命令會把引數 <dir> 中所有的原始檔名稱賦值給引數 <variable> 。

第四行使用命令 ADD_EXECUTABLE 指示變數 DIR_SRCS 中的原始檔需要編譯成一個名稱為 main 的可執行檔案。

2)多原始檔目錄

清單 3 目錄 step2 中的 CMakeLists.txt

PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
ADD_SUBDIRECTORY( src )
AUX_SOURCE_DIRECTORY(. DIR_SRCS) 
ADD_EXECUTABLE(main ${DIR_SRCS})
TARGET_LINK_LIBRARIES( main Test )

相對於清單 2,該檔案添加了下面的內容: 第三行,使用命令 ADD_SUBDIRECTORY 指明本專案包含一個子目錄 src 。第六行,使用命令 TARGET_LINK_LIBRARIES 指明可執行檔案 main 需要連線一個名為Test的連結庫 。
 
第二步,子目錄中的 CMakeLists.txt
在子目錄 src 中建立 CMakeLists.txt。檔案內容如下:


清單 4目錄 src 中的 CMakeLists.txt

AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS)

ADD_LIBRARY ( Test ${DIR_TEST1_SRCS})  

在該檔案中使用命令 ADD_LIBRARY 將 src 中的原始檔編譯為庫

ADD_SUBDIRECTORY( src ) 時進入目錄src 對其中的CMakeLists.txt 進行解析。

3)在工程中查詢並使用其他庫初步

清單5 Findlibdb_cxx.cmake檔案

MESSAGE(STATUS"Using bundled Findlibdb.cmake...")

FIND_PATH(
    LIBDB_CXX_INCLUDE_DIR
    NAMES
    PATHS
    )
FIND_LIBRARY(
    LIBDB_CXX_LIBRARIES NAMES
    PATHS
    )

清單6 能呼叫Finddb_cxx.cmake的CMakeLists.txt檔案
PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(CMAKE_SOURCE_DIR .)
SET(CMAKE_MODULE_PATH ${CMAKE_ROOT}/Modules ${CMAKE_SOURCE_DIR}/cmake/modules)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})

FIND_PACKAGE(libdb_cxx REQUIRED)
MARK_AS_ADVANCED(
LIBDB_CXX_INCLUDE_DIR
LIBDB_CXX_LIBRARIES
)

IF(LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBBRARIES)
MESSAGE(STATUS"Found libdb libraries")
INClUDE_DIRECTORIES(${LIBDB_CXX_INCLUDE_DIR})
MESSAGE(${LIBDB_CXX_LIBRARIES})
TARGET_LINK_LIBRARIES(main ${LIBDB_CXX_LIBRARIES})
ENDIF(LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES)
其中第4行便是設定呼叫清單5的指令;第8行時,cmake會到CMAKE_MODULE_PATH中查詢並執行清單5的指令

(2)用cmake建立動態庫和靜態庫

新建個t3目錄,在t3目錄中再建個lib目錄,在t3目錄中新建個CMakeLists.txt檔案,然後在lib中新建CMakeLists.txt,hello.h,hello.cpp三個檔案

1)清單1 hello.h

//hello.h
#ifndef HELLO_H
#define HELLO_H
#include <stdio.h>
void HelloFunc();
#endif

2)清單2 hello.cpp

//hello.c

#include "hello.h"
void HelloFunc()
{
	printf("Hello World\n");
}

3)清單3 lib目錄下CMakeLists.txt

#CMakeLIsts.txt
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)

4)清單4 t3目錄下CMakeLists.txt

PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)

(3)呼叫動態庫和靜態庫
1)安裝動態庫,在lib目錄下的CMakeLists.txt 清單1

#CMakeLists.txt
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
#SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
SET(CMAKE_INSTALL_PREFIX /home/hewenjia/test/cmaketest/cmake_practice)
INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

2) 呼叫外部共享庫和標頭檔案

新建目錄t4用於存放可執行檔案工程,再建個src,在src中建CMakeLists.txt,類似前面的步驟,清單1如下:

INCLUDE_DIRECTORIES(/home/hewenjia/test/cmaketest/cmake_practice/t3/lib)
LINK_DIRECTORIES(/home/hewenjia/test/cmaketest/cmake_practice/lib)
ADD_EXECUTABLE(main main.c)
TARGET_LINK_LIBRARIES(main libhello.so)

PS:一定需要在建立main後,在連結庫,這個過程可能邏輯上相反,但實現過程的邏輯正確!

清單2 呼叫函式的main.c檔案

//main.c
#include <hello.h>
int main()
{
	HelloFunc();
	return 0;
}

最後執行結果:


參考文獻:

[1] http://wenku.baidu.com/view/2fdbbcf3f61fb7360b4c6526.html

[2] http://wenku.baidu.com/view/c172762fb4daa58da0114a54.html

相關推薦

cmake用法回顧總結

以前用cmake只是為了體驗下它的功能,過不久就忘記了,現在需要用它開發專案,需要總結並熟練它,特作總結如下,是關於ubuntu下使用cmake的方法。 (1)用cmake建立可執行檔案 1)單原始檔目錄 清單 1 原始檔 main.cpp #include<i

JAVA 第六章知識回顧總結

方法 eno except 動作 它的 缺點 不能 修飾 擁有 為了克服JAVA單繼承的缺點,JAVA引入了接口: 接口不是類,是對類的一組需求的描述,由常量和一組抽象方法組成;接口中所有方法自動的屬於public,在接口中聲明方法時不必提供關鍵字public,接口中的域自

extern "C" 用法理解總結

被extern "C"修飾的變數和函式是按照C語言方式進行編譯和連結的 舉個例子: 1.moduleA、moduleB兩個模組 2.B呼叫A中的程式碼 3.其中A是用C語言實現的,而B是利用C++實現的 //moduleA標頭檔案:moduleA.h #ifnde

決策樹系列(一)——基礎知識回顧總結

決策樹系列(一)——基礎知識回顧與總結 1.決策樹的定義       樹想必大家都會比較熟悉,是由節點和邊兩種元素組成的結構。理解樹,就需要理解幾個關鍵詞:根節點、父節點、子節點和葉子節點。       父節點和子節點是相對的,

阿里電面的忐忑回顧總結

內推獲得的一次面試機會,很激動,所以寫下了,總結反思自己,也希望能給看到的小夥伴一點參考。26號收到顯示杭州電話,但是和同學去打羽毛球了沒接到,心裡很忐忑,難得進入到這一步了,還沒接到電話。在網上查了一波,說還會再打,就放心了。27號小哥哥打了電話,確認了投遞的崗位,約了第二

2013年自我回顧總結(1)

本不是喜歡自我總結的人,很多時候認為這也挺矯情的,哈哈,我就是傳說中的簡單直接粗暴一組,女漢子的稱謂也由此而來吧,愛直接也愛簡單,愛coding也愛coding to die,我是女漢子,我為自己代鹽,啊哈哈哈哈。 但是看過大家的總結之後我也是深有感觸的,這一年對於我而言

cmake使用示例整理總結

正則表達式 match related sha dash href 縮進 some 系統信息 本文代碼托管於github cmake_demo cmake中一些預定義變量 PROJECT_SOURCE_DIR 工程的根目錄 PROJECT_BINARY_DIR

js中eval,arguments異常處理的用法-基礎知識總結------彭記(017)

報錯 字符串 nts 字符 number 拖動 ron cnblogs 數組 eval的使用: <script> /*eval的作用: * 1.將字符串當成js代碼來執行 * 2.可以將json格式的字符串轉換為js對象*/

Java基礎知識回顧之static應用總結

相關關鍵字的說明: this關鍵字 final關鍵字 static關鍵字修飾屬性 static關鍵字修飾方法 static關鍵字應用與總結 前面兩篇分別介紹了static的屬性以及方法。本篇就做一個收尾,介紹下剩下的。 在之前的總結: 不管多少個物件,都使用同一個 s

Linux——cmake使用示例整理總結

轉自:http://blog.csdn.net/wzzfeitian/article/details/40963457/ cmake中一些預定義變數 PROJECT_SOURCE_DIR 工程的根目錄PROJECT_BINARY_DIR 執行cmake命令的

2017-12-19python全棧9期第四天第一節之昨日內容回顧作業講解之公司HR輸入人員名單的小程式的用法append

#!/user/bin/python# -*- coding:utf-8 -*-li = ['zs','ls','ww','zl']while 1: username = input('>>>') if username.strip().upper() == 'Q':

auto_ptr shared_ptr 用法和區別總結

一、std::auto_ptr 被複制後,將失去原來所致資源的所有權;*auto_ptr在標頭檔案<memory>中。 永不建立auto_ptr的容器 關於此可以看的Effective STL的條款8 因為auto_ptr並不是完美無缺的,它的確很方便,但也有

2014年終總結回顧2015年工作總結

2016已經開工,開工之前先來對2015年的工作做一個總結。是我們跑的太慢,還是時間跑的太快,是我們跑偏了方向,還是時間在跳躍性的向前,讓時間把我們落的太遠太遠!這一年在做的事情還是花時間去賺錢,依然沒有學會用金錢來換取時間……2014年終總結回顧根據15年的情況,再說說以下

thinkphp錯誤積累總結

erro let pan index 似的 thinkphp php pos ges 1,非法請求:index/user/addlist 使用兩種類似的url分別請求兩個方法 這兩個方法: public function add6(){ $user[‘nickn

atitit.js&#160;c#&#160;java交互html5化的原理總結.doc

pad 托管 works onclick rgb sar com 2.0 swing atitit.js 與c# java交互html5化的原理與總結.doc 1. 實現html5化界面的要解決的策略 1 1.1. Js交互 1 1.2. 動態參數個

C/C++中const關鍵字的用法及其宏定義的比較

類型安全 屬性 const關鍵字 code oid 程序 函數返回值 存儲空間 臨時對象 1.const關鍵字的性質 簡單來說:const關鍵字修飾的變量具有常屬性。 即它所修飾的變量不能被修改。 2.修飾局部變量 1 const int a = 10; 2 int co

[計蒜客NOIP模擬賽]2017.7.28Day1回顧反思總結

n) 模擬 查詢 同時 結點 reg etc mes 停止 D1T1 打地鼠 題目鏈接 反思- 比賽得分-0 思考: 比賽時,以為T1是一道常規模擬題目,沒怎麽看數據範圍。直接手動模擬,模擬完之後太自信也沒有造數據Hack自己的程序。直接導致爆0。同時發現自己對二

Shiro初識總結

有關 基本上 完成 data 高性能 另一個 開發人員 不一定 觀察 1.1簡介   Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼學和會話管理。使用Shiro的易於理解的API,您可以快速、輕松地獲得任何應用程序,從最小的移動應用程序

javascript面向對象屬性函數用法(definePropertygetOwnPropertyDescriptor)

ghost font 返回 java writable fig pan logs ict defineProperty用於設置一個對象的屬性值和描述符,描述符有4個:[[Configurable]], [[Enumerable]], [[Writable]],[[Value

Linux硬鏈接和軟連接的區別總結

無法刪除 文件 點號 原理 和源 image 鏈接命令 快捷 技術 圖示軟硬鏈接的區別 有關硬鏈接的總結 具有相同inode節點號的多個文件互為硬鏈接文件; 刪除硬鏈接文件或者刪除源文件任意之一,文件實體並未被刪除; 只有刪除了源文件和所有對應的硬鏈接文件,文件實體才會