cmakelists语法_CMakeList语法知识

在写这篇文章之前开始是想一些shell脚本与Makefile的一些基础语法知识。但是又觉得太过基础。关于Liunx shell脚本可以看看教程http://c.biancheng.net/linux_tutorial/ CMake是一种跨平台编译工具,CMake主要是编写CMakeLists.txt文件,然后通过cmake命令将CMakeLists.txt文件转化为make所需要的Makefile文件,最后用make命令编译源码生成可执行程序或者库文件。实际项目中的C/C++文件不计其数、文件放置的位置也不同,Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。实现自动化的编译。

CMake方式编译生成库文件

以简单的例子来来看看CMake的语法,创建一个 test项目,项目结构如下

├── test目录

│ ├── CMakeLists.txt

│ ├── include目录

│ │ ├── myprint.h

│ ├── src 目录

│ │ ├── myprint.cpp

│ ├── lib目录

│ ├── biuld目录

示例项目目录结构.png

include目录放置头文件,src目录下放置的是.c/.cpp源文件,biuld目录是用来构建的项目,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来将项目编译成动态库提供给其他项目使用。首先我们要创建CMakeLists.txt文件,简单的来说CMake就是我们把编译信息录入,cmake命令根据CMakeLists.txt生成编译需要的Makefile文件。看看CMakeLists.txt具体的编写

#指定CMake编译最低要求版本

CMAKE_MINIMUM_REQUIRED(VERSION 3.14)

#给项目命名

PROJECT(MYPRINT)

#收集c/c++文件并赋值给变量SRC_LIST_CPP ${PROJECT_SOURCE_DIR}代表区当前项目录

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 动态库 默认生成静态库 SHARED指定生成库类型为动态库

ADD_LIBRARY(myprint SHARED ${SRC_LIST_CPP} ${SRC_LIST_C})

编写好CMakeLists.txt文件 cd到项目biuld目录执行cmake命令 将会在biuld目录下生成Makefile文件,执行make命令项目就会开始编译,在项目lib目录下生成libmyprint.so文件,是不是非常简单,相比编写Makefile文件来说。生成的动态库文件那么我们怎么去链接使用他呢?继续往下看

CMake链接使用库文件

这里就不新建项目啦,直接在src目录下新建源文件建hello.cpp 来应用libmyprint.so库。

#include

#include "/usr/demo/test5/include/myprint.h"

int main() {

myprint("hello World\n");

return 0;

}

那么我们就要重新写个CMakeLists.txt文件,内容如下

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生成可执行文件hello

ADD_EXECUTABLE(hello ${SOURCE})

#指定hello 链接库myprint

TARGET_LINK_LIBRARIES(hello myprint)

cd到项目biuld目录执行cmake命令 将会在biuld目录下生成Makefile文件,执行make命令,编译完后,将在biuld目录下生成可执行文件hello。执行hello

helloworld.png

Android程序员学习CMake最终还是要为我们Android项目服务,Android studio 2.2 之后开始采用 CMake 的这种方式来构建NDK项目。包括一些优秀的开源库也有采用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} )

总结

了解了CMake语法,以及它正真的意义。以后遇上Android NDK项目便可以自己编写CMakeLists.txt文件内容。要想更深的深入可以去学习一下CMake文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring pom设置_Spring社交Twitter设置

spring pom设置在本系列的第一部分中 ,我们研究了如何使用StackExchange REST API来检索其主要问题。 第二部分将重点设置使用Spring Social Twitter项目与Twitter REST API交互所需的支持。 最终目标是能够在多个帐户上每天发送两个问题,每个帐户集中讨…

apache mediawiki 安装_如何在CentOS 7上安装MediaWiki

如果您想构建自己的wiki网站,可以使用MediaWiki轻松完成, MediaWiki是一个最初为WikiPedia创建的PHP开源应用程序。 由于为此应用程序开发的第三方扩展,其功能可以轻松扩展。在本文中,我们将讨论如何使用LAMP (Linux,A…

Java 9迁移指南:七个最常见的挑战

我确定您已经听说过更新到Java 9并不是一件容易的事,甚至可能是不兼容的更新,而且对于大型代码库而言,迁移毫无意义。 这样做之后,我迁移了一个相当大的旧代码库,我可以告诉你,这还不错。 比碰到Java 8确实…

nuxt sass 全局变量的问题_Sass入门教程

SASS(Syntactically Awesome Stylesheet)是一个CSS预处理器,有助于减少CSS的重复,节省时间。 它是更稳定和强大的CSS扩展语言描述文档的风格结构。sass中文网而且Sass算是CSS的超集,它100%兼容CSS的语法,所有在 CSS 中正常工作的代…

javascript对象包含哪些要素_javascript有哪几种对象?

JavaScript中支持3种对象:内置对象(原生对象),浏览器对象,自定义对象。下面本篇文章就来给大家介绍一下,希望对大家有所帮助。对象包含两个要素:1、用来描述对象特性的一组数据,也就是若干变量,…

用C语言实现优先级排序和MATLABsort函数的比较

为了实现对两个数组进行优先级排序,用c语言有两种实现方法, 一是需要对两个数组进行排序,然后对排序后的坐标再排序,(求最小值是我自己需要) 二是直接寻找数组排序后的元素坐标,调用qsort函数进行排序,排序后的数组会存放在原数组中,那么就有两种寻找坐标,一是寻找…

造成内存泄漏_如何造成内存泄漏

造成内存泄漏这将是一个相当邪恶的职位-当您确实希望使某人的生活陷入困境时,您将在谷歌上搜索。 在Java开发领域,内存泄漏只是您在这种情况下会引入的错误类型。 为您的受害者保证几天甚至几周的办公室不眠之夜。 我们将在这篇文章中描述两次泄漏。 两…

寄存器分配图着色_寄存器分配

寄存器分配,是通过将程序变量尽可能地分配到寄存器,从而提高程序执行速度的一种方法。寄存器是编译器优化中最为重要的问题之一(好的寄存器分配能够提高程序执行速度超过250%);也是编译器理论中最热点的研究领域之一(研究界已经提出来大量寄存…

通过Java,Spring Boot应用程序将Gmail用作SMTP服务器

Gmail用户可以使用Gmail的SMTP服务器smtp.gmail.com从其Spring Boot应用程序发送电子邮件。 为此,让我们在应用程序中进行一些设置: 在application.properties文件中提供SMTP连接属性: spring.mail.hostsmtp.gmail.com spring.mail.username…

在建工地扬尘在线监控系统推荐_配电室为何需要安装蓄电池在线监控系统?保定钰鑫电气...

配电室蓄电池在线监控系统提高了蓄电池运行质量、增强了电力系统的安全运行、保障蓄电池运行环境的可靠,打造无人值守配电室、智能化运维模式,减少蓄电池损耗、浪费,降低了维护成本,为何需要安装一套配电室蓄电池在线监测系统&…

最好的Java开发人员测试和集成工具

通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控。 参加AppDynamics APM导览! 无论您是刚开始还是已经使用了一段时间,使用正确的工具进行编程都可以对项目的成功产生巨大的影响。 适当的工具使您可以编写更好的代码…

最速下降法matlab全局最小值_梯度下降概念

1、梯度概念(1)从几何意义上讲,就是函数变化最快的地方。在单变量的函数中,梯度只是导数,其实就是函数在某个给定点的切线的斜率;在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了…

jpa querydsl_JPA – Querydsl投影

jpa querydsl在我的上一篇文章中: JPA –基本投影 –我提到了构建JPA投影的两种基本可能性。 这篇文章为您带来了更多示例,这次基于Querydsl框架。 注意,这里我指的是Querydsl版本3.1.1。 重塑构造函数表达式 看下面的代码: ...…

同步服务老是报错_悬而未决:MYSQL配置好主从同步后没有报错,但数据一直没有同步过来是什么原因? | 学步园...

我是用下面的步骤来配置主从数据库服务器(都是MYSQL 5.1.47)的:1、在主服务器上FLUSH TABLES WITH READ LOCK;然后再复制数据库文件到从服务器。2、在主服务器上创建同步用户账号rsyncuser。修改my.cnf开启主服务器上的bing-log,没有指明binlog-do-db&am…

IntelliJ中的远程调试Wildfly应用程序

远程调试Java应用程序意味着使用本地开发环境连接到远程运行的应用程序。 Java开箱即-agentlib:jdwp[options]支持远程调试:目标应用程序必须使用-agentlib:jdwp[options]选项执行, -agentlib:jdwp[options]选项加​​载Java调试线协议(jdwp&…

云桌面 瘦终端_云桌面选择云终端还是瘦客户机?

我们发现最近很多用户在部署青椒云桌面的时候,经常会出现这么一种情况,那就是不知道是该选择云终端还是瘦客户机而不断纠结的,云终端和瘦客户机到底有什么不同的呢,为什么经常会有很多用户因为不知道如何选择它们而感到纠结的呢&a…

cordic ip核 vivado_Xilinx Vivado CORDIC IP求解atan 反正切

赛灵思官方提供了cordic(coordinate rotational digital computer) ip核实现直角坐标极坐标变化,三角函数的操作。我介绍下它进行反正切求解的使用:新建个简单工程:bd如下进行ip设置,选择运算位反正切后,ip端口回自动变…

检测和测试停滞的流– RxJava常见问题解答

假设您有一个流以不可预测的频率发布事件。 有时您可以预期每秒会有数十条消息,但是偶尔几秒钟都看不到任何事件。 如果您的流是通过Web套接字,SSE或任何其他网络协议传输的,则可能会出现问题。 静默时间过长(停顿)可以…

linux 远程挂载摄像头_如何实现嵌入式Linux下USB摄像头视频采集

展开全部在linux下所e5a48de588b662616964757a686964616f31333337613134有设备都是文件。所以对摄像头的操作其实就是对文件的操作。USB摄像头的设备文件就是在/dev目录下的video0(假如只有一个摄像头)。在linux下操作摄像头就是使用v4l2对摄像头进行视频的操作,操作…

Effective Java第三版有哪些新功能?

自从听说即将出版的有效Java 第三版以来,我一直想知道其中有什么新内容。 我假设将涵盖自Java 6以来引入Java的功能,的确如此。 但是,第三版Java开发人员经典版也有一些其他更改。 在本文中,我提供了有关在第三版中添加&#xff0…