- 博客(64)
- 收藏
- 关注
转载 CMake从入门到实战系列(十八)—— CMake中的include指令,提高项目的模块化和可重用性
CMake官网中对于include指令的介绍,如下:翻译:从文件或模块加载并运行CMake代码。CMake中的include 指令用于将其他CMake文件或模块包含到当前文件中,并且在当前作用域有效。这条指令会读取所包含文件中的代码,并立即执行这些命令,就好像它们直接写在 include 命令所在的位置一样。
2024-12-19 11:42:37
455
转载 CMake从入门到实战系列(十七)—— CMake添加环境检查
在使用CMake构建C/C++项目时,添加环境检查可以确保构建环境满足项目的需求,例如检查编译器版本、依赖库的存在、头文件和函数的存在等。CMake提供了一些内置的模块和命令来进行这些检查。以下是详细步骤和示例,说明如何在CMake中添加环境检查。可以编写自定义的CMake脚本进行更复杂的检查。# 自定义检查endif()
2024-12-19 11:35:26
123
转载 CMake从入门到实战系列(十五)—— CMake中添加编译选项的几种方法
在嵌入式工作开发调试过程中,我们常会遇到需要添加编译选项的情况。添加适当的编译选项能够帮助我们更好地控制程序行为,优化代码,确保稳定性和性能。常见的编译选项有-s、-g、-O3、-fPIC、-Wall、-Werror、-Wextra等。在CMake中为项目增加编译选项有多种方法,下面我们来详细介绍几种常见的方法。
2024-12-19 11:21:49
342
转载 CMake从入门到实战系列(十四)——CMake中增加预处理器定义的几种方法
CMake中的预处理定义类似C语言中的预处理或宏定义。CMake中预处理器定义的应用场景,可以用于控制编译过程中的条件编译,或者为源代码中的条件语句提供条件判断,或者作为变量供源代码使用。CMake中增加预处理器定义的方法有三种:add_definitions、add_compile_definitions、target_compile_definitions。
2024-12-19 11:14:58
504
转载 CMake从入门到实战系列(十三)——CMake中如何执行shell命令(2)add_custom_target 和 add_custom_command
在CMake中执行shell命令主要涉及三个指令:execute_process、add_custom_command、add_custom_target。这三个命令参数都比较多,但其实我们并不需要全部了解,甚至一般情况下只需要用到其中的两三个。上一篇文章我们对execute_process进行了总结,此篇文章我们对add_custom_command和add_custom_target进行总结。
2024-12-19 11:08:13
285
转载 CMake从入门到实战系列(十二)——CMake中如何执行shell命令(1)
在CMake中执行shell命令主要涉及三个指令:execute_process、add_custom_command、add_custom_target。我们将分别对每个指令做一下总结,并用示例代码加深理解。本章对指令execute_process进行一下总结,下一篇文章对add_custom_command和add_custom_target进行总结。
2024-12-19 11:01:22
164
转载 CMake从入门到实战系列(十一)——CMake支持gdb调试
CMake和GDB的结合确实能使C或C++的开发工作变得轻松,它们可以共同实现跨平台的项目构建和源代码级别的调试。下面详细阐述一下如何使用CMake配置项目以便使用GDB进行调试,以及提供一个C语言的demo。
2024-12-19 10:54:11
246
转载 CMake从入门到实战系列(十)——CMake中的条件语句和循环语句
CMake提供了条件语句和循环语句等控制结构,用于根据不同条件执行不同的操作或重复执行某些操作。
2024-12-19 10:48:26
162
转载 CMake从入门到实战系列(九)——CMake中的字符串处理指令string
1、string(APPEND …)是用来修改已存在变量的内容,通过追加方式扩展该变量的字符串值。2、string(CONCAT …)是用于合并多个字符串值创建一个新的字符串变量,原有变量的值不会改变。3、在选择使用哪一个的时候,可以根据你的具体需求来决定:如果你想要修改已有变量的值,可以使用APPEND;如果你想保留原有变量不变,而创建一个新的字符串,那么CONCAT会是更好的选择。以上为一些基础的示例,实际应用中可能需要根据具体需求组合使用这些命令。
2024-12-19 10:39:53
244
转载 CMake从入门到实战系列(八)——CMake中的算数运算符,比较运算符和逻辑运算符
加法 (+): 用于将两个数值相加。减法 (-): 用于从一个数值中减去另一个数值。乘法 (*): 用于将两个数值相乘。除法 (/):用于将一个数值除以另一个数值。请注意,这是整除操作,如果你在操作的是整数,那么结果也会是整数,小数部分会被省略。取模(%):用于获得两个数值相除后的余数。括号 (()): 用于改变运算顺序,括号内的运算会被优先计算。CMake使用这些运算符,可以构建从简单到复杂的数学表达式,用于计算或者进行条件判断。EQUAL:相等NOT:不等于LESS:小于。
2024-12-19 10:30:08
152
转载 CMake从入门到实战系列(七)——CMake指令option、add_definitions、target_sources
上一篇文章《CMake从入门到实战系列(六)——CMake自定义编译选项》中的demo用到了三个CMake指令,在之前的文章《CMake从入门到实战系列(三)——CMake常用指令》没有提到,此篇文章,我们对这三个指令option、add_definitions、target_sources进行一下总结,后期我们还会对CMake其他指令进行总结,比如条件语句、循环语句等等。总之,option 指令是 CMake 中非常有用的功能,允许用户方便地启用或禁用项目中的各种特性,从而对构建过程进行灵活的控制。
2024-12-19 10:20:14
211
转载 CMake从入门到实战系列(六)——CMake自定义编译选项
CMake允许为项目增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案,即用户定义自定义编译选项,这样用户可以在编译时选择是否开启某项特性。下面实例入手总结CMake的自定义编译选项:考虑一个简单的C语言项目,我们想让用户决定是否启用一个名为FEATURE_X的自定义特性。如果启用,我们将编译带有特殊行为的代码;如果不启用,我们将编译默认行为的代码。
2024-12-19 10:02:57
91
转载 CMake从入门到实战系列(五)——CMake常见的四种构建类型
目的:用于调试。特点:不优化代码,保留完整的调试信息,使得开发者可以进行调试,找出程序中的错误。由于没有优化,程序运行速度较慢,体积较大。适用场景:开发阶段,当需要调试代码以定位和修复错误时使用。
2024-12-19 09:54:19
119
转载 CMake从入门到实战系列(四)——CMake链接静态库和动态库
对于复杂的或非标准路径中的库,你可能需要使用find_package(对于支持CMake的库)或find_library来找到库的确切位置,然后再链接它们。要在CMake中链接系统的第三方库,并通过find_library找到这个库,我们可以创建一个实用的C语言项目作为示例。链接第三方库通常涉及在CMake中指定库文件的路径和告知编译器链接这些库。链接到系统的第三方库,如pthread或m(数学库),在CMake中通常使用find_package或target_link_libraries来实现。
2024-12-19 09:47:01
1571
转载 CMake从入门到实战系列(三)——CMake常用指令
当您使用 CMake 构建项目时,您可能会有许多头文件位于不同的目录中,这些头文件可能是您自己的项目中的头文件,也可能是您依赖的库的头文件。当您使用CMake构建项目时,通常需要链接一些库文件,这些库文件可能位于您的系统中的不同位置。在上篇文章中,我们以实例入手,详细的总结了CMake的基本流程,但是,我们发现一个问题,就是CMake在构建过程中会产生一些临时文件、中间文件和构建系统文件,这些文件和源代码在一个目录里,使的源代码文件混乱,不够整洁,影响了源代码目录的整洁性、可维护性和灵活性。
2024-12-19 08:57:20
183
转载 CMake从入门到实战系列(二)——实例入手,讲解CMake的基本流程
在linux平台下使用 CMake 的基本流程如下:1、编写 CMake配置文件2、执行命令 cmake PATH。其中,PATH 是 CMakeLists.txt所在的目录。3、使用 make 命令进行编译。针对上面的流程,初步接触CMake的读者可能还是不太清楚明了,那么接下来,我们通过实例开始总结CMake的基本流程。
2024-12-18 20:19:13
148
转载 CMake从入门到实战系列(一)——CMake介绍以及安装方法
CMake"这个名字是"cross platform make"的缩写。虽然名字中含有"make”,但是CMake和Unix上常见的"make"系统是分开的,而且更为高阶。1、CMake是一个强大的跨平台的编译工具,它使用配置文件(CMakeLists.txt)来生成标准的构建文件,能够输出各种各样的makefile或者project文件。
2024-12-18 17:58:14
206
原创 网络通信 基础知识
【1】组播 单播方式只能发给一个接收方。 广播方式发给所有的主机。过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。 组播(又称为多播)是一种折中的方式。只有加入某个多播组的主机才能收到数据。 多播方式既可以发给多个主机,又能避免象广播那样带来过多的负载(每台主机要到传输层才能判断广播包是否要处理)【2】网络地址 A类地址...
2018-10-16 14:22:58
338
原创 OpenCV(for Python)视频分析 Meanshift 和 Camshift
目标• 本节我们要学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象Meanshift 算法Meanshift 算法的基本原理是和很简单的。假设我们有一堆点,和一个小的圆形窗口,Meanshift 算法就是不断移动小圆形窗口,直到找到圆形区域内最大灰度密度处为止。# -*- coding: utf-8 -*-"""Create
2018-01-04 14:07:17
1790
原创 STM32F1xx 固件库 下载地址
STM32F1xx 固件库 下载地址http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries.html?querycriteria=productId
2017-07-31 11:08:18
20420
2
转载 PC端windows与虚拟机linux之间文件的传输方式总结
PS:转载地址http://www.cnblogs.com/wxjnew/archive/2013/06/05/3118808.html当然,windows与linux之间文件的传输的两种方式有很多,这里就仅仅列出工作中遇到的,作为笔记;方法一:安装SSH Secure Shell Client客户端安装即可登录直接拖拉到linux,如果从linux下导出文件则需要如此操作文件
2017-07-17 22:35:29
3473
原创 链表翻转/逆序
// 链表翻转// 整个过程即:对开始为第一个的元素(固定,地址不变)之后的元素 断链、头插的过程;void list_reversal1(linknode *H) // 从第二个元素(第三个节点)开始,依次头插 {linknode *p = H->next,*q = NULL; // p-开始时第一个元素的地址 , q- p下一个元素的地址whi
2017-03-17 13:45:21
347
转载 container_of函数
首先,我定义了一个字符设备结构体struct globalmem_dev{ struct cdev my_cdev; //字符设备之基础结构体 unsigned char mem[GLOBALMEM_SIZE]; struct semaphore sem;/};接下来我实例化了一个该设备的指针对象struc
2016-12-14 18:12:34
486
原创 Python语言编程(一)
Python的特色简单易学,功能强大。注重的是如何解决问题,而不是编程语言的语法和结构自由、开放:Python是自由开放软件/源码之一可移植性:在不同的系统不需要更改就可以适应系统环境解释性:Python语言写的程序不需要编译成二进制代码,你可以直接执行源代码Python既支持面向过程的编程,也支持面向过程的编程。可嵌入性:你可以把Python嵌入到C/C++程序,从而向你
2016-12-10 23:48:12
379
转载 文件IO - O_DIRECT和O_SYNC详解
O_DIRECT和O_SYNC是系统调用open的flag参数。通过指定open的flag参数,以特定的文件描述符打开某一文件。这两个flag会对写盘的性能有很大的影响,因此对这两个flag做一些详细的了解。先看一个open函数的使用例子.123456/* Open new or
2016-12-09 10:41:29
8609
转载 为什么用函数指针
一般的时候用不到,主要还是一个简化结构和程序通用性的问题,也是实现面向对象编程的一种途径。简单的总结为:1. 实现面向对象编程中的多态性2. 回调函数举两个例子:1. 你现在要实现一个文件系统,但是文件的介质有硬盘和软盘,那么它们各自的读写函数实现肯定是不一样的。好比 int a_write(char *data_stream, int LBA
2016-12-09 10:19:22
1047
原创 查询字符串中字母和数字的个数
***************判断ASCII的方式,查询字符串中字母、数字的个数*****************int i,zm=0,sz=0;char s[200];gets(s);for(i=0;s[i];i++){ if(s[i]>='A'&&s[i]='a'&&s[i]='z') zm++; else if(s[i]>='0'&&s[i]='9
2016-12-07 22:15:13
1255
1
原创 TCP/IP协议传输中的三次握手和四次挥手
*******************TCP/IP协议中的三次握手和四次挥手**********************1、建立连接协议(三次握手) (1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。 (2)服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志S
2016-12-07 21:53:05
343
原创 epoll脚本
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合。
2016-12-07 21:19:30
249
原创 Tcp、udp区别 基于包,基于流 ?
1:用户数据报协议(UDP),UDP协议是面向无连接的不可靠服务,在传输数据之前不需要先建立连接。远地主机的运输层收到UDP报文后,不需要给出任何确认,传输数据快,不能广播。2:传输数据报协议(TCP),TCP 则提供面向连接的可靠服务。在传输数据前必须先建立连接,数据传输完毕后要释放连接,传输数据慢,能广播。
2016-12-07 21:18:06
4212
原创 数组和链表区别
数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。但是增加和删除一个元素对于链表数据结构就只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。
2016-12-07 21:16:34
301
原创 进程、线程的区别
面试题常常会出现的一道题: 一个程序至少有一个进程,一个进程至少有一个线程; 进程在执行过程中拥有独立的内存单元,而多个线程共享内存; 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。进程和线程的主要差别在
2016-12-07 21:08:59
225
原创 strcat的实现
#include "stdio.h" char *strcat(char *str1, char *str2) { assert((str1==NULL)||(str2==NULL)) ; char *pt = str1; while(*str1!='\0') str1++; while(*str2!='\0') *str1+
2016-12-07 20:24:23
375
原创 strcpy的实现
char * mystrcpy(char *dst,char *src){char * p = dst;while(*src != '\0'){*dst = *src;src++;dst++;}*dst = '\0';return p;}
2016-12-07 19:56:13
272
原创 strcmp的实现
int mystrcmp(char *s1,char *s2){while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0'){s1++;s2++;}if(*s1 return -1;else if(*s1 > *s2)return 1;elsereturn 0;}
2016-12-07 19:46:31
312
原创 C语言——字符串翻转
一、指针的方式实现char* strrev2(const char* str){ char* tmp = new char[strlen(str) + 1]; strcpy(tmp,str); char* ret = tmp; char* p = tmp + strlen(str) - 1; while
2016-12-07 18:20:06
348
原创 assert();宏的使用
这是个定义在 中的宏, 用来测试断言。一个断言本质上是写下程序员的假设, 如果假设被违反, 那表明有个严重的程序错误。例如, 一个假设只接受非空指针的函数, 可以写: assert(p != NULL);一个失败的断言会中断程序。断言不应该用来捕捉意料中的错误, 例如 malloc() 或 fopen() 的失败。
2016-12-07 17:10:03
327
原创 函数memset的实现
原型: void *memset(void *buffer, int c, int count);功能:把buffer所指内存区域的前count个字节设置成字符c。void *memset(void *src, intc, size_t count){ assert(src!=NULL); char *tmpsrc=(char*)src; while(count--
2016-12-07 17:01:01
799
原创 哈希表原理
根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中某一个位置来访问记录,以加快查找的速度;这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表是一个以空间换取时间的数据结构,理想情况下的时间复杂度为O(1)。 散列函数的构造方法:(1)直接定址法 取关键字或关键字的某个线性函数值为散列地址;即H(key)=key或H(key) = a•key
2016-12-07 16:59:14
346
原创 什么是大端什么是小端字节序?网络字节序是大端还是小端的?
小端:低地址存放低字节,高地址存放高字节; 大端:高地址存放低字节,低地址存放高字节;网络字节序是:大端。
2016-12-07 16:57:26
7531
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人