cmakelists语法_CMakeList语法知识
在寫這篇文章之前開始是想一些shell腳本與Makefile的一些基礎語法知識。但是又覺得太過基礎。關于Liunx shell腳本可以看看教程http://c.biancheng.net/linux_tutorial/ CMake是一種跨平臺編譯工具,CMake主要是編寫CMakeLists.txt文件,然后通過cmake命令將CMakeLists.txt文件轉(zhuǎn)化為make所需要的Makefile文件,最后用make命令編譯源碼生成可執(zhí)行程序或者庫文件。實際項目中的C/C++文件不計其數(shù)、文件放置的位置也不同,Makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作。實現(xiàn)自動化的編譯。
CMake方式編譯生成庫文件
以簡單的例子來來看看CMake的語法,創(chuàng)建一個 test項目,項目結(jié)構(gòu)如下
├── test目錄
│ ├── CMakeLists.txt
│ ├── include目錄
│ │ ├── myprint.h
│ ├── src 目錄
│ │ ├── myprint.cpp
│ ├── lib目錄
│ ├── biuld目錄
示例項目目錄結(jié)構(gòu).png
include目錄放置頭文件,src目錄下放置的是.c/.cpp源文件,biuld目錄是用來構(gòu)建的項目,lib目錄用來放置我們生成庫文件。
include目錄下的myprint.h頭文件
#include
#include
void myprint(char* str);
src目錄下myprint.cpp文件
#include "/usr/demo/test5/include/myprint.h"
void myprint(char* str) {
printf("%s",str);
}
怎樣利用CMake來將項目編譯成動態(tài)庫提供給其他項目使用。首先我們要創(chuàng)建CMakeLists.txt文件,簡單的來說CMake就是我們把編譯信息錄入,cmake命令根據(jù)CMakeLists.txt生成編譯需要的Makefile文件。看看CMakeLists.txt具體的編寫
#指定CMake編譯最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
#給項目命名
PROJECT(MYPRINT)
#收集c/c++文件并賦值給變量SRC_LIST_CPP ${PROJECT_SOURCE_DIR}代表區(qū)當前項目錄
FILE(GLOB SRC_LIST_CPP ${PROJECT_SOURCE_DIR}/src/*.cpp)
FILE(GLOB SRC_LIST_C ${PROJECT_SOURCE_DIR}/src/*.c)
#指定頭文件目錄
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
#指定生成庫文件的目錄
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#去變量SRC_LIST_CPP 與SRC_LIST_C 指定生成libmyprint 動態(tài)庫 默認生成靜態(tài)庫 SHARED指定生成庫類型為動態(tài)庫
ADD_LIBRARY(myprint SHARED ${SRC_LIST_CPP} ${SRC_LIST_C})
編寫好CMakeLists.txt文件 cd到項目biuld目錄執(zhí)行cmake命令 將會在biuld目錄下生成Makefile文件,執(zhí)行make命令項目就會開始編譯,在項目lib目錄下生成libmyprint.so文件,是不是非常簡單,相比編寫Makefile文件來說。生成的動態(tài)庫文件那么我們怎么去鏈接使用他呢?繼續(xù)往下看
CMake鏈接使用庫文件
這里就不新建項目啦,直接在src目錄下新建源文件建hello.cpp 來應用libmyprint.so庫。
#include
#include "/usr/demo/test5/include/myprint.h"
int main() {
myprint("hello World\n");
return 0;
}
那么我們就要重新寫個CMakeLists.txt文件,內(nèi)容如下
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
#指定項目名稱
PROJECT(HELLO)
#將hello.cpp 賦值給SOURCE 變量
SET(SOURCE ${PROJECT_SOURCE_DIR}/src/hello.cpp)
#指定頭文件目錄
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
#指定鏈接庫文件目錄
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)
#將hello.cpp生成可執(zhí)行文件hello
ADD_EXECUTABLE(hello ${SOURCE})
#指定hello 鏈接庫myprint
TARGET_LINK_LIBRARIES(hello myprint)
cd到項目biuld目錄執(zhí)行cmake命令 將會在biuld目錄下生成Makefile文件,執(zhí)行make命令,編譯完后,將在biuld目錄下生成可執(zhí)行文件hello。執(zhí)行hello
helloworld.png
Android程序員學習CMake最終還是要為我們Android項目服務,Android studio 2.2 之后開始采用 CMake 的這種方式來構(gòu)建NDK項目。包括一些優(yōu)秀的開源庫也有采用CMake的方式來編譯。具體看看CMake在Android中的使用。
Android中的CMakeLists.txt
由于后面會寫一些關于NDK音視頻的知識,就以引入FFmpeg音視頻庫來看看Android 中CMakeLists.txt是怎么編寫的。
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)
# 需要引入我們頭文件,以這個配置的目錄為基準
include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)
#添加共享庫搜索路徑
link_directories(${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi)
# 指定源文件目錄
AUX_SOURCE_DIRECTORY(${CMAKE_SOURCE_DIR}/src/main/cpp SRC_LIST)
add_library(
# Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
# src/main/cpp/native-lib.cpp
${SRC_LIST}
)
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
target_link_libraries( # Specifies the target library.
native-lib
avcodec-57
avdevice-57
avfilter-6
avformat-57
avutil-55
swresample-2
swscale-4
postproc-54
# Links the target library to the log library
# included in the NDK.
${log-lib} )
總結(jié)
了解了CMake語法,以及它正真的意義。以后遇上Android NDK項目便可以自己編寫CMakeLists.txt文件內(nèi)容。要想更深的深入可以去學習一下CMake文檔。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的cmakelists语法_CMakeList语法知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 红米路由器ac2100怎样设置ipv6_
- 下一篇: 奇富科技与360智脑升级战略合作 加速完