CMake使用入門

一、開胃菜

hello目錄下的文件結構:

├── CMakeLists.txt
├── hello.c
├── hello.h
└── main.c

C代碼見下節。

最簡單的cmake配置文件:

project(HELLO)
set(SRC_LIST main.c hello.c)
add_executable(hello ${SRC_LIST})

如果要編譯成gdb可調試的debug版本,則在配置文件中加入:

set(CMAKE_BUILD_TYPE Debug)

如果要編譯成可用gprof分析的版本,則在配置文件中加入:

set(CMAKE_BUILD_TYPE Profile)
set(CMAKE_CXX_FLAGS_PROFILE "-pg")

最簡單的編譯過程(在hello目錄中編譯):

cmake .
make

這樣就會在hello目錄中生成可執行文件hello和其他cmake相關的配置文件。

為了讓代碼整潔,可以使用所謂的out-of-source編譯方式:

mkdir build
cd build
cmake ..
make

這樣編譯產生的所有文件都在build中了。

二、一個小工程hello示范

本例主要包含獨立庫文件、可執行文件的編譯和安裝過程中涉及的相關問題。

hello目錄中的文件結構:

├── CMakeLists.txt
├── libhello
│?? ├── CMakeLists.txt
│?? ├── hello.c
│?? └── hello.h
└── src├── CMakeLists.txt└── main.c

文件內容如下:

project(HELLO)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_INSTALL_PREFIX /tmp/hello)
add_subdirectory(libhello)
add_subdirectory(src)

set(CMAKE_INSTALL_PREFIX:設置程序的安裝目錄,優先級比cmake命令參數設置高。

set(LIB_SRC hello.c)
add_definitions("-DLIBHELLO_BUILD")
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_library(libhello SHARED ${LIB_SRC})
add_library(hello_static STATIC ${LIB_SRC})
install(TARGETS libhello LIBRARY DESTINATION lib)
install(TARGETS hello_static ARCHIVE DESTINATION lib)
install(FILES hello.h  DESTINATION include)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")

(1)add_library:生成庫文件,SHARED表示動態鏈接庫;
(2)set(LIBRARY_OUTPUT_PATH:生成的庫文件路徑,PROJECT_BINARY_DIR和CMAKE_BINARY_DIR、<projectname>_BINARY_DIR都是指進行編譯的目錄;
(3)install:安裝頭文件和庫文件到相應的目錄;
(4)set_target_properties(libhello:生成的庫文件名為libhello.so,若沒有這一行,庫文件名就是liblibhello.so。

include_directories(${PROJECT_SOURCE_DIR}/libhello)
link_directories(${CMAKE_INSTALL_PREFIX}/lib)
aux_source_directory(. APP_SRC)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
add_executable(hello ${APP_SRC})
target_link_libraries(hello libhello)
install(TARGETS hello RUNTIME DESTINATION bin)
set_property(TARGET hello PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)

(1)include_directories:指定頭文件路徑;
(2)link_directories:指定庫文件路徑;
(3)aux_source_directory:將當前目錄(.)中的所有文件名賦值給APP_SRC;
(4)set(EXECUTABLE_OUTPUT_PATH:生成的可執行文件的路徑,PROJECT_BINARY_DIR和CMAKE_BINARY_DIR、<projectname>_BINARY_DIR都是指進行編譯的目錄;
(5)add_executable:生成可執行文件,PROJECT_SOURCE_DIR和CMAKE_SOURCE_DIR、<projectname>_SOURCE_DIR都是工程的頂級目錄;
(6)target_link_libraries:libhello要和./libhello/CMakeLists.txt中的libhello對應;
(7)install(TARGETS:安裝程序到${CMAKE_INSTALL_PREFIX}/bin目錄;
(8)set_property:設定安裝的可執行文件所需的庫文件路徑,如果沒有該項設置,會出錯:cannot open shared object file: No such file or directory。

#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_
#include <stdio.h>
#include "hello.h"void hello(const char *name)
{printf ("Hello %s!\n", name);
}
#include "hello.h"int main(int argc, char *argv[])
{hello("World");return 0;
}

在hello目錄下編譯程序:

mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/tmp
make
make install

(1)-DCMAKE_INSTALL_PREFIX=/tmp讓程序的安裝目錄變為/tmp/bin,默認情況CMAKE_INSTALL_PREFIX=/usr/local;
(2)若在CMakeLists.txt中設置了set(CMAKE_INSTALL_PREFIX /tmp/hello),此處的設置無效。

編譯之后,hello目錄中主要文件結構:

├── build
│?? ├── bin
│?? │?? └── hello
│?? ├── lib
│?? │?? ├── libhello.so
│?? │?? └── libhello.a
│?? ├── libhello
│?? └── src
├── CMakeLists.txt
├── libhello
│?? ├── CMakeLists.txt
│?? ├── hello.c
│?? └── hello.h
└── src├── CMakeLists.txt└── main.c

build目錄中有4個子目錄,libhello和src目錄中是源文件對應目錄在cmake過程中生成的中間文件。

安裝后,/tmp/hello目錄內的結構:

├── bin
│?? └── hello
├── include
│?? └── hello.h
└── lib├── libhello.a└── libhello.so

參考資料:
http://blog.csdn.net/dbzhang800/article/details/6314073
http://blog.csdn.net/dbzhang800/article/details/6329068
http://www.cmake.org/Wiki/CMake_RPATH_handling

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255685.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255685.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255685.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【pyqt5學習】——給窗口添加圖標

from PyQt5.QtGui import QIcon# 當前文件的目錄 self.dir os.path.dirname(os.path.abspath(__file__)) # 圖標ico文件存放的絕對路徑 icoPath self.dir r"\data\favicon.ico" # 添加圖標 self.setWindowIcon(QIcon(icoPath))

C/C++語言變量聲明內存分配

[cpp] view plaincopy<span style"font-family: Verdana, Arial, Helvetica, sans-serif; ">一個由c/C編譯的程序占用的內存分為以下幾個部分</span> 1、棧區&#xff08;stack&#xff09;— 程序運行時由編譯器自動分配&#xff0c;存放函數的參數值…

sql server數據庫實現保留指定位數小數的函數

有時候需要對一個特定的含有小數點的數字保留指定位數&#xff0c;比如“123.123600”。 在數據庫中以函數的形式實現如下&#xff1a; USE [數據庫名稱] GO /****** Object: UserDefinedFunction [dbo].[AvgLimit] Script Date: 2016/12/29 11:30:44 ******/ SET ANSI_NUL…

Centos7下安裝netstat

剛安裝centos7發想沒有查看端口的命令 netstat yum install net-tools轉載于:https://www.cnblogs.com/cuizhipeng/p/5329811.html

【pyqt5學習】——items view相關控件(list view、table view)

目錄 list view——列表視圖 table view——表格視圖 list view——列表視圖 PyQt5-高級控件使用&#xff08;QListView&#xff09; - ygzhaof_100 - 博客園QListView用于展示數據&#xff0c;子類是QListWidget。QlistView基于模型Mode&#xff0c;需要程序創建Model然后保…

變量定義和聲明的區別~~~概念上千萬不要栽跟頭!!!

變量的聲明有兩種情況&#xff1a; 1、一種是需要建立存儲空間的。例如&#xff1a;int a 在聲明的時候就已經建立了存儲空間。 2、另一種是不需要建立存儲空間的。 例如&#xff1a;extern int a 其中變量a是在別的文件中定義的。 聲明是向編譯器介紹名字&#xff0d;&…

解決Ajax不能跨域的方法

1. Ajax不能跨域請求的原因 同源策略(Same Origin Policy)&#xff0c;是一種約定&#xff0c;該約定阻止當前腳本獲取或者操作另一個域下的內容。所有支持Javascript的瀏覽器都支持同源策略&#xff0c;也就是說瀏覽器可以隔離來自不同源的內容&#xff0c;阻止跨域請求的發生…

【pyqt5學習】——containers相關控件(tab widget、scroll area、stack widget、tool box、MDI area、dock widget)

目錄 1、tab widget 2、scroll area 2.1 使用方法 Step1.拖入QScrollArea ?Step2.改變widget控件布局 ?Step3.設置scrollAreaWidgetContents大小 3、Tool Box 4、Stacked Widget 4.1 案例展示 5、frame 6、MDI AREA 7、dock widget 7.1 懸浮狀態 7.2 吸附狀態 conta…

Java使用原子類進行多線程的 i++ 操作示例

2019獨角獸企業重金招聘Python工程師標準>>> 使用AtomicInteger原子類進行 i 操作 可以有類似 synchronized 實現同步的效果。 原子操作是不能分割的整體&#xff0c;沒有其他線程能夠中斷或檢查正在原子操作中的變量。一個原子類型就是一個原子操作可用的類型&…

深入理解面向對象設計的七大原則

一&#xff0e;面向對象設計的七大原則是什么&#xff1f; 1.開放封閉原則 2.里氏轉換原則 3.依賴倒轉原則 4.組合/聚合原則 5.接口隔離原則 6.“迪米特”法則 7.單一職責原則 二&#xff0e;七大原則是什么含義&#xff1f; 序號 面向對象設計七大原則 偶的理解 1 …

mybatis實戰教程(mybatis in action)之二:以接口的方式編程

前面一章&#xff0c;已經搭建好了eclipse,mybatis,mysql的環境&#xff0c;并且實現了一個簡單的查詢。請注意&#xff0c;這種方式是用SqlSession實例來直接執行已映射的SQL語句&#xff1a;session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID&…

Linux內核分析06

進程的描述和進程的創建 一&#xff0c;進程的描述 進程控制塊PCB——task_struct &#xff08;進程描述符&#xff09;&#xff0c;為了管理進程&#xff0c;內核必須對每個進程進行清晰的描述&#xff0c;進程描述符提供了內核所需了解的進程信息。 struct task_struct數據結…

【pyqt5學習】——pyqt5中.qrc資源文件的創建與編寫

目錄 一、說明 二、安裝pyqt5以及相關工具&#xff08;pyqt5、pyuic、pqrcc&#xff09; 三、創建.ui文件 1、選中文件右鍵-external-pyqt5 打開GUI設計界面 2、創建一個界面&#xff08;內含四個等大label框&#xff09; 3、CTRLS保存 4、找到ui文件&#xff0c;右鍵--e…

zabbix3.0.4通過jmx監控tomcat

jdk下載頁面http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlhttp://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm?AuthParam1462948138_871b75d4b1dd7155e8cbe4f23e5cd2cd腳本[rootNFS-WEB1 latest]# vim /e…

C#學習筆記——25個經典問題

1.靜態成員和非靜態成員的區別&#xff1f; 2.const 和 static readonly 區別&#xff1f; 3.extern 是什么意思&#xff1f; 4.abstract 是什么意思&#xff1f; 5.internal 修飾符起什么作用&#xff1f; 6.sealed 修飾符是干什么的&#xff1f; 7.override 和 o…

PHP的學習--RSA加密解密

PHP服務端與客戶端交互或者提供開放API時&#xff0c;通常需要對敏感的數據進行加密&#xff0c;這時候rsa非對稱加密就能派上用處了。 舉個通俗易懂的例子&#xff0c;假設我們再登錄一個網站&#xff0c;發送賬號和密碼&#xff0c;請求被攔截了。 密碼沒加密&#xff0c;那攻…

Swift學習

1、Swift網址 http://swiftdoc.org/ 2、 https://github.com/ipader/SwiftGuide 轉載于:https://www.cnblogs.com/superbobo/p/5329876.html

【pyqt5學習】——最新版:配置external tools(designer、pyuic、pqrcc)

目錄 1、pip install PyQt5 2、pip install pyqt5-tools 3、file-settings-tools-external tool 點擊加號定義工具名字&#xff0c;名字隨意便于區分即可 雙擊每一個工具名字&#xff0c;配置路徑&#xff08;注意每一個exe的路徑&#xff09; designer.exe pyuic.exe py…

Linux中vi命令詳解

最近vi用的多&#xff0c;很多技巧不知道&#xff0c;備注一份&#xff0c; vi編輯器是所有Unix及Linux系統下標準的編輯器&#xff0c;它的強大不遜色于任何最新的文本編輯器&#xff0c;這里只是簡單地介紹一下它的用法和一小部分指令。由于 對Unix及Linux系統的任何版本&…

C# 屬性和字段

以下的文章是摘錄的&#xff0c;作者已經不詳了。之所以摘錄&#xff0c;是因為這個概念很重要特別對于VFP程序員來說&#xff0c;這里構造屬性就與vfp的方法完全不同。c#的屬性融合了vfp的addproperty() 和屬性的access method和assign method 。不一而足使用屬性&#xff0c…