C/C++
文章平均质量分 86
C/C++
zhangatong
这个作者很懒,什么都没留下…
展开
-
由于 SIGPROF 信号,clone() 系统调用无限重启
最近遇到一个c++ 代码里调用system函数然后没返回的问题,此时调用进程所在CPU占用率100%。通过 strace 和ftrace工具跟踪系统调用,以及查看内核源码,发现 此时,进程会一直不停的调用 clone系统调用,而 clone系统调用一直返回出错。strace :ftrace:内核添加打印:根据错误 ERESTARTNOINTR在 内核代码里找到报错的地方:系统调用时,检测到信号导致系统调用中断返回 ERESTARTNOINTR 错误值,处理信号后重新调用该系统调用。原创 2023-09-08 10:32:25 · 309 阅读 · 0 评论 -
“undefined reference to“ 问题解决方法
最近在 Linux 下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:(.text+0x13): undefined reference to `func’关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。1. 链接时缺失了相关目标文件(.o)测试代码如下:然后编译。gcc -c test.cgcc –c main.c得到两个 .o 文件,.转载 2020-09-15 15:42:24 · 2223 阅读 · 0 评论 -
CMake 链接第三方的库 和 添加C++11的支持
这里的例子, 是链接libev , 如下:我的CMake 版本是3.10# CMake 最低版本号要求cmake_minimum_required (VERSION 2.8)# 项目信息project (server)# 查找当前目录下的所有源文件# 并将名称保存到 DIR_SRCS 变量aux_source_directory(. DIR_SRCS)# 添加第三方的库set(INC_DIR /usr/local/include/)set(LINK_DIR /usr/lo.转载 2020-09-03 14:39:46 · 676 阅读 · 0 评论 -
configure 添加--enable-xxx --with-xxx 参数选项
如果要给configure生成像--enable-XXXX,--disable-XXXX,--with-XXXX,--without-XXXX这样的参数,就需在configure.ac里用到AC_ARG_ENABLE和AC_ARG_WITH这两个宏,AC_ARG_ENABLE和AC_ARG_WITH语法如下:AC_ARG_ENABLE(option-name, help-string, action-if-present, action-if-not-present)AC_ARG_WITH (pac原创 2020-07-31 15:14:37 · 3351 阅读 · 0 评论 -
动态库 soname
编译了一个动态库,生成了好几个文件,有libname.so,libname.so.x, libxx.so.x.y,libxx.so.x.y.z,都有什么区别?Linux中命名系统中共享库的规则libname.so.x.y(或libname.so.x.y.z,最后一个版本号可不要)这种是真正的库文件,libname.so 和 libname.so.x一般是指向libname.so.x.y的软链接。链接libname.so.x是的作用是为了动态库升级方便,一般在编译真正的库libname.s..原创 2020-07-22 19:08:16 · 499 阅读 · 0 评论 -
将打印(printk/printf)及时写入文件的方法
问题是这样的,在测试一个gps的app的时候,我使用脚本 “ gps_test_app > /tmp/gps_log.txt &"但是但是,去查看gps_log.txt的时候并没有看到正常的打印结果。原因是系统为了效率,不会每时每刻都去写文件,他是有一个触发条件才会去写文件。那么如果我希望及时写入文件,我好查看log,要怎么办呢?解决方法如下:加入以下2行代码:...转载 2020-02-21 14:11:32 · 1077 阅读 · 1 评论 -
NDEBUG 、DEBUG宏 和assert() 的用法
一、NDEBUG 和DEBUG宏的用法 1、NDEBUG宏是Standard C中定义的宏,专门用来控制assert()的行为。如果定义了这个宏,则assert不会起作用。#ifdef NDEBUG#define assert(x) ((void)0)#else...2、C Standard中规定了assert以宏来实现。<assert.h>被设计来可以被...转载 2020-01-07 11:19:23 · 1107 阅读 · 0 评论 -
把RGB数据写入BMP文件
bool Write555BitImg2BmpFile(u8 *pImg, int width, int height, const char * filename){typedef unsigned long DWORD;typedef unsigned short WORD;typedef long LONG;#pragma p...原创 2019-12-10 15:28:35 · 619 阅读 · 0 评论 -
__weak 关键字的作用
在阅读linux uboot源码时,可以看到一些函数定义带有__weak关键字,比如:这是个宏定义#define __weak __attribute__((weak))在函数名称前面加上__weak 关键字,我们一般称这个函数为“弱函数”。加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定...原创 2019-10-29 19:51:40 · 337 阅读 · 0 评论 -
父类指针强转为子类指针的问题
https://bbs.csdn.net/topics/390719124问题:经常看到一个函数的参数包含一个父类指针例如voidfun(Base*msg)然后函数体内把msg强转为子类的指针:Child*pchildMsg=(Child*)msg然后对pchildMsg一通操作包括成员函数和成员变量。问题是pchildMsg不是不能访问子类成员变量吗?不能访问到pchi...原创 2019-08-07 10:30:54 · 3136 阅读 · 0 评论 -
makefile介绍
make命令执行时,需要一个makefile文件,以告诉make命令需要怎么样的去编译和链接程序。首先,我们用一个示例来说明makefile的书写规则,以便给大家一个感性认识。这个示例来源于gnu 的make使用手册,在这个示例中,我们的工程有8个c文件,和3个头文件,我们要写一个makefile来告 诉make命令如何编译和链接这几个文件。我们的规则是: 如果这个工程没有编译过,那么我...转载 2019-07-31 21:26:00 · 150 阅读 · 0 评论 -
Linux 静态库和动态库的制作和使用
一、linux操作系统支持的函数库分支 静态库:libxxx.a,在编译时就将库编译进可执行程序 优点:程序的运行环境中不需要外部的函数库 缺点:可执行程序大 动态库:又称共享库,libxxx.so,在程序运行时将库加载到可执行程序中 优点:可执行程序小 缺点:程序的运行环境中必须提供相应的库 函数库目录:/lib /usr/lib二...转载 2018-09-23 11:44:09 · 275 阅读 · 0 评论 -
关于bss段的理解
bss段是不会出现在程序下载文件(*.bin *.hex)中的,因为全都是0。如果把它们出现在程序下载文件中,会增加程序下载文件的大小。实际应用中,通常只需要把bss段的起始地址和结束地址(或大小)保存起来,而不需要将程序下载文件中出现bss段(一堆0)将来真正运行程序的时候,再根据这两个数据进行bss段的初始化就行了。.bss不占据程序可执行程序大小,只在段表中记录大小,在符号表中记录符号。...原创 2018-12-24 23:04:27 · 2030 阅读 · 0 评论 -
C++强制类型转换操作符 const_cast
const_cast也是一个强制类型转换操作符。《C++ Primer》中是这样描述它的:1.将转换掉表达式的const性质。2.只有使用const_cast才能将const性质性质转化掉。试图使用其他三种形式的强制转换都会导致编译时的错误。(添加const还可以用其他转换符,如static_const)3.除了添加const或删除const特性,使用const_cast符来执行...转载 2019-03-29 21:18:06 · 1718 阅读 · 0 评论 -
const引用形参的意义
如const int &ival首先如果它只是const非引用形参那么实参是否为const对它没有影响,因为只是传递副本。而当它为非const引用形参,那么它是实参的别名,对它的修改也就是对实参本身的修改,,而当它为const 引用形参 那么将会修改实参的值 而他本身不会修改?那么引用是实参的别名而后加了个const 也就是说别名不会被修改 就是说ival的不会被修改 请问下这是为什么...转载 2019-03-29 21:20:46 · 859 阅读 · 0 评论 -
c结构体、c++结构体、c++类的区别
C和C++中结构体的不同:a) C语言中的结构体不能为空,否则会报错1>d:\myproject\visual studio 2013\projects\myc++\main.c(71): error C2016: C 要求一个结构或联合至少有一个成员b) C语言中的结构体只能定义成员变量,但是不能定义成员函数。然而在C++中既可以定义成员变量又可以定义成员函数, C++中的结构...转载 2019-06-19 21:34:59 · 414 阅读 · 0 评论 -
C++ 类声明 类前置声明范例
转载自http://www.cnblogs.com/staring-hxs/p/3244251.html在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration)。下面的程序中,带注释的那行就是类B的前置说明。这是必须的,因为类A中用到了类B,而类B的声明出现在类A的后面。如果没有类B的前置说明,下面的程序将不同通过编译,编译器将会给出类似“缺少类型说明符”这样的出...转载 2019-07-19 18:47:40 · 8851 阅读 · 2 评论 -
do {...} while (0) 在宏定义中的作用
如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间。在很多的C程序中,你可能会看到许多看起来不是那么直接的较特殊的宏定义。下面就是一个例子: 1 2 #define __set_task_state(tsk, state_value) ...转载 2019-07-29 19:22:53 · 78 阅读 · 0 评论 -
ATL接口映射宏详解
https://blog.csdn.net/tofy?t=1转载 2019-07-29 19:36:23 · 148 阅读 · 0 评论 -
const指针 与指向const的指针的区别
const 指针与指向const的指针当使用带有const的指针时其实有两种意思。一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。听起来有点混淆一会放个例子上来就明白了。 先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。 const int* p; (推荐) int const* p; 第...转载 2016-08-09 09:43:28 · 5948 阅读 · 1 评论