![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux_应用层开发
文章平均质量分 54
Linux方面的开发经验
17岁boy想当攻城狮
在时间的大钟上,只有两个字「现在」
展开
-
深度剖析“GCC编译器编译过程”
(这张图是本人画的并非网络图,如果有编译过程没有提到的可以提出来)首先说说第一步一.预编译1.配置编译器环境编译器在编译之前要运行配置文件通常叫configure的配置文件,一般这个配置文件是由autoconf生成!autoconf简介:autoconf是由GNU组织开发的,autoconf的作用是能检查当前系统环境配置,包括分析一些软件包的依赖属性,并生成con原创 2017-08-21 11:07:02 · 903 阅读 · 2 评论 -
Linux下的GCC和Windows下Visual Studio的编译所生成的文件作用
首先先说一下Linux吧因为这也是博主最早接触的编程开发环境所以比较熟悉的!Linux下就说GCC GCC编译如果不指定编译选项的话是一步到位没有额外的后缀名文件!.i文件:.i文件是GCC -E预处理之后所生成的文件,里面包含着已经完成宏替换,条件编译以及头文件包含等宏指令!.s文件:.s文件是GCC -S把预处理文件(.i)翻译成汇编代码的文件,包括头文件包含函数语法调用全部都会翻原创 2017-08-21 14:41:07 · 3144 阅读 · 0 评论 -
gnu ld链接出现“ no .eh_frame_hdr table will be created.”
ld: error in 8259.o(.eh_frame); no .eh_frame_hdr table will be created.问题描述:我有三个文件:8259a.c、pics.s、main.c其中8259a.c依赖pics.s,而main.c依赖8259.c和pics.s我想先将8259a.c和pics.s一起编译成.o文件编译命令:gcc -m...原创 2019-12-23 21:11:12 · 4014 阅读 · 0 评论 -
使用select模型详细介绍并使用此模型来监视标准输入缓冲区stdin里是否还有数据
select是sock通讯下的一个api,主要用来检查sock文件描述符所指向的文件缓冲区里的状态,最常用的检查缓冲区里是否还有数据,在sock模型下凡事从网络中发来的数据都会临时存放到缓冲区里,然后程序员使用read等函数读走,这个函数不仅可以用来检查sock文件描述符,同时还可以用来检查标准的c语言输入输出缓冲区的状态!函数原型:int select( int nfds, fd_set FAR...原创 2018-06-26 02:07:50 · 1660 阅读 · 0 评论 -
Linux下使用exec命令将文件与文件描述符关联
在shell脚本下exec为系统自带的脚本命令,其作用是用来执行其他程序:语法格式:exec (选项)(参数)选项:-c:在当前环境下执行命令,即在当前shell脚本下执行,而不是打开一个新的shell参数:要执行的脚本示列:exec -c echo linux输出:linux 其效果与:echo linux是一样的,并且exec还可以用来指定文件描述符首先要知道什么是文件描述符:文件描述符是...原创 2018-06-25 03:28:50 · 1527 阅读 · 0 评论 -
Linux开发_GDB_dump_Core调试
dump core = 核心转储,也就是我们平时在Linux上最容易遇到的段错误这种错误一般是因为你访问了一些不可越界的内存导致的,在操作系统上有als地址随机化与虚拟地址保护,我们不能访问越过我们自己程序内存边界的地址如果访问了一般就会出现这种错误:当然,当你尝试修改一些只读区域的内存也会出现这种情况,这是因为内核发现你在尝试做一些违规行为,那么内核会拦截并杀死你的程序。当我们在写大工程的时候,出现这种情况的确让人很头疼,在大工程下,文件那么多,较为优秀的工程里模块化的占有率也比较高,原创 2020-10-21 15:18:28 · 374 阅读 · 0 评论 -
Bash 输入输出缓冲区
这里它用了read命令,read是从输入缓冲区里读取内容,而bash这段调用:原创 2023-01-03 23:26:38 · 497 阅读 · 0 评论 -
Opencv4.5无法打开MP4等格式视频文件解决方案
Windows在build目录下有三个dll:opencv_world455.dllopencv_videoio_msmf455_64.dllopencv_videoio_ffmpeg455_64.dll其中ffmpeg的dll是opencv对视频文件解码的支持库,一般地情况下我们程序只需要opencv_world455.dll就能运行,但是如果你想要解码AVI以外的格式opencv会尝试加载ffmpeg的dll,当没有加载到的情况下会return false,你可以把这个dll放入到你原创 2022-02-24 14:41:03 · 6083 阅读 · 2 评论 -
关于二进制兼容(二进制边界)的解释
二进制兼容二进制兼容是针对动态链接库而言的,如果你的源代码已经编译成为可执行文件了,其中你调用了一些动态库,后来你为这个动态库进行了更新,并替换掉原来的动态库了,如果程序在运行时正常运行没有任何问题,那么这个库就是二进制兼容(二进制边界正常)。源代码兼容如果换了库,但是无法运行,需要重新编译修改一些形参传递之类的问题,才能正常运行!二进制不兼容如果换了库,却怎么也无法运行,即使重新编译也无法运行,...原创 2018-04-03 17:00:13 · 2762 阅读 · 0 评论 -
Linux编译Opencv3.4.7: relocation R_X86_64_PC32 against `ff_w_ff‘ can not be used when makin with -fPIC
libavcodec.a(hevc_cabac.o):relocation R_X86_64_PC32 against `ff_w_ff' can not be used when makin with -fPIClibavcodec属于ffmpeg的库,从ff_w_ff这个标志就可以看的出来这个原因是因为opencv想要加载动态库但是libavcodec为静态库,因为没有加-fPIC的原因,注意这里不是让你去修改opencv的cmake附加参数,加上-fPIC,这个是不行的,我们需要重新编译f..原创 2020-11-04 17:35:31 · 1979 阅读 · 7 评论 -
>>’ should be ‘> >’ within a nested template argument list
这种情况是你的编译器误认 >>是位移运算了,要加空格将:vector<vector<cv::Point>> /*cv vector*/ _var_CVve_contours; //contours替换为vector<vector<cv::Point> > /*cv vector*/ _var_CVve_contours; //contours...原创 2021-01-15 10:55:36 · 294 阅读 · 0 评论 -
undefined reference to `sqlite3_column_table_name‘
这个问题是因为安装sqlite3的时候没有把sqlite3_column_table_name相关函数编译进来,如果你是使用ubnutu上的apt软件包安装的默认是没有编译这个func的。这个问题在sql的编译文档里有写Source Of Data In A Query Resultconst char *sqlite3_column_database_name(sqlite3_stmt*,int);const void *sqlite3_column_database_name16(sq原创 2021-01-24 17:05:41 · 3687 阅读 · 5 评论 -
Windows环境与Linux环境条件宏
当你windows下使用visual studio环境时可以用:WIN32 宏Linux环境GNU工具链(包含g++):__GNUC__示列:#ifdef WIN32//xxx#elif __GNUC__//xxx#endif原创 2021-04-08 14:01:24 · 597 阅读 · 0 评论 -
expected initializer before
今天遇到一个奇怪的问题,在做windows移植到Linux上时候产生的这个函数定义没有什么问题int __stdcall test_one(){}在Linux上用的是GNU的那一套编译器套件,GNU是不允许这样写的。GNU上是__attribute__((__stdcall__))所以把__stdcall改成__attribute__((__stdcall__))就可以了。...原创 2021-03-08 14:39:13 · 2592 阅读 · 0 评论 -
Linux开发_最全在Ubnutu环境下为你的程序设置快捷启动项和启动时管理员权限
一般情况下,我们写了一个GUI程序,想要像火狐或者等其它程序一样在桌面显示我们的快捷方式,并且单击就可以启动,不需要使用终端命令行的方法和Windows有很大的区别Windows上的EXE程序点击Windows内核会自动装载到内存,自动解析PE文件格式,而Linux下不一样,Linux思想就是终端shell,而非可视化GUI,所以Linux对GUI支持并不高,很多发行版如Ubnutu,就是所有Debian发行版里比较受欢迎的一个桌面版,每个发行版都提供一些针对生成桌面快捷方式的方法。Linux内核本原创 2020-11-20 01:07:25 · 477 阅读 · 0 评论 -
Linux下Shell脚本命令行参数:getopt、getopts用法
简介我们通常在编写shell脚本时简单的方式是通过参数的方式来取到我们想要的参数,如:#!/bin/bash SYSCODE=$1APP_NAME=$2MODE_NAME=$3但是这有一个问题,就是参数的位置是固定的,倘若用户在调用脚本时参数位置不固定那么就会出现问题,这种方法一般只适用于一两个参数的情况,我们可以使用更高阶的方案,在Linux中提供了两个命令:getopt与getopts,getopts是getopt更高阶的命令,我们先从最简单的介绍,先从getopt开始介绍..原创 2022-04-09 19:47:47 · 5229 阅读 · 0 评论 -
Linux开发_多线程编程
Linux下的多线程使用的库是pthread,是一个准守POSIX接口的函数库。Linux下多线程编程对函数定义原型有要求,必须是void *函数名(void *参数名),或者void 函数名(void);主要创建函数是:pthread_create参数:参数 描述 thread 指向线程标识符指针。 attr 一个不透明的属性对象,可以被用来设置线程属性。您可以指定线程属性对象,也可以使用默认值 NULL。 start_routine 线程运行函数起原创 2020-05-16 04:49:49 · 364 阅读 · 0 评论 -
Linux开发_生成executable (application/x-executable)可执行程序
以前的老版本GCC默认生成的是ELF 64-bit LSB executable格式,后来到了新版本后生成的是ELF 64-bit LSB shared object版本,这个格式是最新Linux里采用的一些执行格式,但是目前很多发行版的桌面资源管理器不认,我们双击是无法打开的。我们只需要加上“-no-pie”命令,不采用这个文件格式如果你的程序是依赖shell没有窗口的话,那么不会显示,但是后台会执行,不会输出,如果是窗口程序则会弹出窗口并且双击即可运行,如果非executable格式的e原创 2020-11-20 09:08:31 · 4256 阅读 · 2 评论 -
Linux开发_判断程序是否以管理员权限运行(root/sudo)
使用“geteuid”函数获取当前程序所属用户组#include <unistd.h>#include <stdio.h>#include <stdlib.h>bool isRoot(){ if(geteuid() == 0){ return true; }else{ return false; } }如果是使用sudo或者root权限运行的都属于root,root用户组uid原创 2020-11-06 16:59:50 · 1553 阅读 · 0 评论 -
Linux开发_反编译开发_破解简单登录程序外加缓冲区溢出攻击
缓冲区溢出攻击即破坏指定buff的缓冲区大小,使其溢出到别的空间上去,破坏堆栈。比如有如下代码:#include <stdio.h>#include <string.h>int main(){ char buff[15] = {0}; int pass = 0; printf("password:"); gets(buff); if(strcmp(buff,"hello") == 0)原创 2020-12-17 01:25:50 · 485 阅读 · 8 评论 -
Linux界面开发_GTK+&glade_1_环境配置与简介
目录Linux界面开发_GTK+&glade第一篇:环境配置与简介1.1 GTK+简介1.2 GLADE简介2 环境配置2.1 在debian linux上配置GTK+3.0(这是目前gtk+最新版本)2.1.1 安装开发所需依赖库2.1.2 使用apt软件管理包安装2.2 安装GLADELinux界面开发_GTK+&glade第一篇:环境配置与简介1.1 GTK+简介GTK+是通用跨平台界面库,它支持windows以及mac os和.原创 2020-12-21 14:37:31 · 1006 阅读 · 1 评论 -
Linux开发_WARNING: ‘aclocal-1.14‘ is missing on your system.
在编译zmq时遇到的问题:WARNING: 'aclocal-1.14' is missing on your system.意思是make没有找到aclocal这种原因是因为缺失一些make文件,可能造成的原因是你在编译的时,突然中断,导致一些文件丢失。解决办法:1.:到make目录下使用autoreconf -ivf2.:建立make编译文件(博主就是这种解决方案):touch configure.ac aclocal.m4 configure Makefil原创 2020-09-14 20:38:49 · 639 阅读 · 0 评论 -
Linux开发_快速定位关键字与变量
Linux下开发几乎很少用IDE,基本书都是tmux,vim和zsh以及cmake与gdb这些构成一个完整的开发工具链。那么当我们进行大型甚至中小型的项目时,文件非常多,不使用IDE的情况下如何查找一些结构体的定以或者关键字呢?grep -n -H -R "define" *grep是查找文件里匹配字符-n 显示行号-H 显示文件名-R 递归查找每个子目录"define" 要查找的关键字* 通配符,表示任何可能包含define的字符如果不加* 则只会搜索以define开原创 2020-10-04 22:02:34 · 387 阅读 · 0 评论 -
Linux开发:error: ‘clockid_t’ has not been declared
今天在Linux下进行编程开发,需要一个时间类的模块,就写了一个名为time的类,用于项目的时间模块。名为:time.htime.c结果编译时发现报出:/usr/include/pthread.h:239:34: error: ‘clockid_t’ has not been declared │~原创 2020-09-17 14:24:28 · 1653 阅读 · 0 评论 -
Linux开发_控制shell光标
// 清除屏幕#define CLEAR() printf("\033[2J")// 上移光标#define MOVEUP(x) printf("\033[%dA", (x))// 下移光标#define MOVEDOWN(x) printf("\033[%dB", (x))// 左移光标#define MOVELEFT(y) printf("\033[%dD", (y))// 右移光标#define MOVERIGHT(y) printf("\033[%dC",(y))//.原创 2020-11-06 11:36:23 · 508 阅读 · 1 评论 -
gcc unsed和used的作用
很多时候我们在编写代码的时候,如果此时编译器检查等级比较高,编译器会将警告视为错误,比如一个函数里有某些变量虽然存在但未使用,那么会报错,同时比如我们将某些变量放入某个段里然后通过指针指向地址来对它进行引用,那么会产生一个问题,如果开启了优化等级,如果这个变量在代码里没有被明确引用那么它可能不会被生成,就导致了指针引用方式出现了NULL的问题。(该属性附加到函数,意味着即使函数似乎未被引用,也必须为该函数发出代码。第一个问题可以使用unused属性来解决,第二个问题可以使用used属性来解决。...原创 2022-07-15 11:05:33 · 818 阅读 · 1 评论 -
Linux下GCC报:extern “C“ _declspec(dllexport)相关错误
在使用GNU工具链时默认是导出函数,并且GCC里不认_declspec(dllexport)使用条件宏分开:#ifdef WIN32#define WEYE_UDP_PACKETS_EXTERN extern "C" _declspec(dllexport)#elif __GNUC__#define WEYE_UDP_PACKETS_EXTERN extern "C"#endif...原创 2021-04-08 14:05:52 · 3899 阅读 · 1 评论 -
Linux开发_调试与安全_gdb_peda简介
$ git clone https://github.com/longld/peda.git ~/peda$ echo "source ~/peda/peda.py" >> ~/.gdbinit 后期关于Linux方面有关的破解与安全文章,大多会使用peda,后面文章会教大家peda是什么,如何使用,如何用来调试...原创 2020-10-04 19:35:14 · 705 阅读 · 0 评论 -
Linux开发_退格符的花样用法
利用退格符实现的:#include <iostream>#include <cstring>#include <stdlib.h>#include <signal.h>#include <unistd.h>class wss{public: ~wss(){ if(d != NULL){ delete []d; } } unsigned char原创 2020-11-06 13:41:06 · 564 阅读 · 0 评论 -
Linux上将二进制文件转化为c语言数组
在Linux下有一个非常好用的工具叫xxd,可以在debian仓库直接安装sudo apt install xxd然后通过如下命令就可以将文件转成c语言数组文件了xxd -i xxx.jpg > test.h原创 2021-11-04 12:51:21 · 1033 阅读 · 0 评论 -
Linux下setsockopt函数返回-1,errno=22
当时在写一个跨平台的程序,里面有一部分涉及到socket这一块的代码,代码如下:int nTimeOver=1000;#ifdef WIN32 if (::setsockopt(m_OutSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)#elif __GNUC__ if (setsockopt(m_OutS原创 2021-04-06 17:42:48 · 3387 阅读 · 0 评论 -
Linux Dbus
Linux Dbus是由项目开发的一款IPC进程间通讯技术,它是基于在Unix 域套接字实现的,它在sockets上面进行了封装并提供了一套更加规范、方便、安全的通讯机制,同时定义了一套标准接口,目前已经被大量Linux发行版所采用,比如Ubuntu、Centos...Dbus最初的目的就是为桌面应用程序之间提供IPC通讯技术它不属于Linux内核的一部分,它目前没有被Linux内核所采纳。原创 2023-03-27 16:28:19 · 3267 阅读 · 1 评论 -
Linux开发_printf打印无消息或末尾带“#“or“%“
有的时候开发使用printf或者cout打印时,会出现无消息或者末尾带“#”和"%"printf打印无输出这个原因起源于unix,unix内核实现是当输出缓冲区没有爆满的情况下或者没有\n符号是不会将输出缓冲区里的字符输出到tty窗口里的。可以使用fflush(),或者字符尾部加上“\n”打印末尾带有:"#" "%"如:这个原因是因为shell符号当我们打印完成之后程序结束时,程序退出,回到shell或者zsh的时会输出一个键入符。shell为"%" zsh为“#”原创 2020-09-11 10:59:52 · 747 阅读 · 0 评论 -
linux下通过伪造udp包来实现指定网卡发送数据
1.包含头文件#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <time.h>#include <stdlib.h>#include <stdbool.h>2原创 2021-05-18 09:05:05 · 2433 阅读 · 4 评论 -
Linux编译libpcap
在官网下载libpcap:wget -C http://www.tcpdump.org/release/libpcap-1.10.0.tar.gz解压:tar -xvf libpcap-1.10.0.tar.gz && cd libpcap-1.10.0执行gnu的一键部署makefile工具:./configure报错:configure: error: Neither flex nor lex was found.因为缺少flex库,安装一下就可以了原创 2021-04-23 14:07:12 · 605 阅读 · 0 评论 -
Linux下打包qt程序,可以发布到一台纯净的linux发行版系统上
1.把你要发布的程序单独放到一个文件夹下2.在文件夹下创建一个sh脚本名为pack.sh输入以下内容#!/bin/sh exe="app" #你需要发布的程序名称des="/home/zzh/RadarDataHub" #程序所在路径deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')cp $deplist $des脚本很简单,就是利用ldd获取程序依赖库,然后找到依赖路径,通过cp命令caop原创 2021-04-05 12:54:59 · 2247 阅读 · 4 评论