C/C++
柳鲲鹏
建立了编程学(编程基本功、平台化编程)、六石管理学等几个流派。
每涉及一个领域,都是顶级砖家。在这些领域中,如果遇到问题,最后肯定是搜索到本博客。
展开
-
std::shared_ptr转换为其他类型
本来好好的用指针,现在多了个shared_ptr,转换为其他类型,就不能直接转了。如果类型不匹配,结果为NULL。不检查类型,出错了你负责。原创 2024-08-08 10:35:23 · 217 阅读 · 0 评论 -
msgget()=-1, errno 2(No such file or directory).
这几天发现程序工作异常。如果是开机启动,就出错;如果是手工启动,就正常。原因也简单,就是负责创建的进程,还没有正式工作。原创 2024-07-19 10:35:28 · 203 阅读 · 0 评论 -
遭遇字节对齐导致的错误一例
由于系统不支持UTF8中文,所以改成了wchar_t。我看了一下字幕,0、2、4不显示,1、2、3显示。后来猜测到是字节对齐问题。0行有两个字节被占用了。原因找到了,就有办法解决。原创 2024-04-29 09:02:05 · 243 阅读 · 0 评论 -
使用swprintf代替sprintf,格式化wchar_t
swprintf和sprintf最大区别,就是swprintf要加个长度限制。原创 2024-04-19 11:19:04 · 364 阅读 · 0 评论 -
When specifying an out-of-tree source a binary directory must be explicitly specified.
真有牛人提供了解决办法。原创 2024-01-31 08:55:32 · 523 阅读 · 0 评论 -
给编译好的so修改rpath为当前路径
这几天调整安装,发现有些文件安装到/lib下。就想复制到安装目录,这样影响更少。然后发现rpaht有问题。修改为当前路径最好。在编译的时候,大多使用$ORIGIN。因为$有特殊含义,所以这里进行了转义。可以看到由编译的绝对路径,变成了相对路径。.或者$ORIGIN。原创 2024-01-23 11:36:12 · 736 阅读 · 1 评论 -
CMake为rpath设置相对路径
【代码】CMake为rpath设置相对路径。原创 2024-01-23 08:52:52 · 1026 阅读 · 0 评论 -
为什么跟踪崩溃时,经常死在sleep?
上周跟踪崩溃,结论非常奇怪,似乎死在sleep。sleep是正宗系统函数,这个也动不动崩溃,那系统每分钟都要死几次。所以肯定与sleep无关。也就是说,代码在sleep,其他部分还在工作,导致崩溃。那么为什么看起来死在sleep上?原创 2024-01-22 09:01:37 · 402 阅读 · 0 评论 -
Could NOT find Threads (missing: Threads_FOUND)
【代码】Could NOT find Threads (missing: Threads_FOUND)原创 2024-01-15 09:03:01 · 1020 阅读 · 0 评论 -
CMake Error at CMakeLists.txt:14 (project): The CMAKE_CXX_COMPILER:
解压后,再配置一下PATH。原创 2024-01-14 08:57:30 · 755 阅读 · 0 评论 -
把应用转为LINUX服务失败,两个奇怪错误
经过定位,确认是memcpy(dst, src, strlen(str))这一句出错。这src是产生线程时的参数。我直接把src赋值,就没问题。应用经常崩溃,于是就想转为服务,让系统帮忙重启。这个事情当然信心满满,咱之前做过,最近也刚刚实验过。systemctl start weiyu,然后就卡死在这里。甚至我把main基本清理干净了,还是卡死。目前只能放弃,以后有机会再深入研究。我另外的一个测试程序就完全正常。原创 2024-01-12 09:01:49 · 389 阅读 · 0 评论 -
使用线程初始化某工作的思路
这几天接手代码之后,添加了柳氏风格的LOG。昨天检查LOG的时候,发现有的设备会初始化多次。于是研究了代码,使用的是线程初始化,如果中途断线还要一直初始化。仔细想想,这个思路有点问题。怎样确保当前只有一个初始化的工作?指针为NULL,时间大于1,指定间隔后再次初始化。指针为NULL,时间为1,正在初始化;指针不为NULL,表示正常;原创 2024-01-11 09:03:09 · 366 阅读 · 0 评论 -
C/C++去掉预定义宏__FILE__路径,只保留文件名的办法
试了一下__FILE_NAME__这个宏不能用,怎么办?特意加了括号,保证是个独立体。原创 2024-01-10 13:50:13 · 557 阅读 · 0 评论 -
Ubuntu上cJSON下载编译
【代码】Ubuntu上cJSON下载编译。原创 2023-12-18 16:32:20 · 761 阅读 · 0 评论 -
error: overloaded function with no contextual type information
这一套代码也是久经考验,一直能用,怎么就报错了?destroy与别的重复。原创 2023-12-09 08:22:18 · 515 阅读 · 0 评论 -
pthread_join造成卡死
最近在调试摄像头APP时,发现拔下摄像头时,会卡死。网上搜索了一番,说是在使用之前,使用pthread_detach操作即可。正好看到有人更新了库,其中明确说是解决卡死问题。我对于这个线程问题,一时也有点糊涂,以后专门研究看看。更新代码后试了一下,有所改善。具体有没有解决,存疑。试了之后,并无效果。原创 2023-11-24 11:15:45 · 809 阅读 · 1 评论 -
C中weak关键字的用处
在代码中的关键字WEAK, 表示弱定义。原创 2023-08-02 11:07:48 · 291 阅读 · 0 评论 -
对于volatile关键字的正确理解
最早接触volatile这个关键字,大约是2000年从JAVA中看到的。大意是说某个变量容易改变,用到的地方多,所以要加。可能取到的不是当前值。当时是非常疑惑的:咱这个变量是一个实例,怎么就可能不是当前值。也就是说,你要正确理解volatile这个关键字的用处,必须从执行的角度。近来学习材料,终于明白了。原创 2023-07-04 08:19:33 · 129 阅读 · 0 评论 -
STM32控制LED灯的源码(寄存器)
红绿两个灯,可以单独点亮、关闭,也可以同时点亮关闭。就是这个延时,写法太愚蠢。原创 2023-07-01 10:03:27 · 485 阅读 · 0 评论 -
error LNK2001: 无法解析的外部符号 snprintf
【代码】error LNK2001: 无法解析的外部符号 snprintf。原创 2023-06-15 08:53:22 · 690 阅读 · 2 评论 -
libusb代码研究
libusb_open_device_with_vid_pid调用libusb_open。native_uvc_unref_device调用libusb_close。后来就没有再仔细研究了。原创 2023-06-11 08:17:11 · 102 阅读 · 0 评论 -
-Werror=deprecated-declarations
增加-Wno-error=deprecated-declarations。具体增加位置看编译脚本。原创 2023-05-11 08:41:56 · 1473 阅读 · 0 评论 -
warning: incompatible implicit declaration of built-in function ‘memset’
【代码】warning: incompatible implicit declaration of built-in function ‘memset’原创 2023-02-05 10:37:56 · 503 阅读 · 1 评论 -
在LINUX系统监视器中,正确显示应用图标
泰山OFFICE在任务栏上图标显示正确,在系统监视器中就是系统默认的。这怎么办呢? 正好另外一个托盘小程序,在系统监视器中显示正确。这就好办了,抄一下。具体代码如下:这个东西搜索了好久,还是在自己代码中发现的,哈哈。原创 2022-11-17 16:54:16 · 217 阅读 · 1 评论 -
C为什么没有被C++取代
以上,在 C 编译器中不会有的,C 编译器一般不会偷偷插入开发者不知道的指令,你写了什么代码,对应的机器指令和你预期的所差无几。如果一个项目如果对内存和编译后的机器指令做精准控制,那么应该优先选择 C 而不是 C++,C++ 编译器在背后插入了太多的指令。随着 C++ 的不断有新标准出炉,编译器在 C++ 背后做的事情越来越多,相比较而言 C 语言编译器在背后就老实许多。链接:https://www.zhihu.com/question/266995763/answer/2751818359。原创 2022-11-15 08:40:59 · 411 阅读 · 0 评论 -
for()循环时,先判断条件,再执行
有人问,如果我想先执行再判断条件呢?可以使用do/while。这个代码是没有输出的。原因就是先判断条件,符合时再执行。原创 2022-10-27 09:05:56 · 2819 阅读 · 1 评论 -
特定条件下,可以使用与(&)操作,代替取模(&)
当n%a时只有a是2的幂函数的值时才能用 & 代替。也就是a = 2^k (k为整数)原创 2022-10-27 08:33:54 · 110 阅读 · 0 评论 -
error: pasting “(“ and “1“ does not give a valid preprocessing token
编译C,头文件中的宏定义,在别的系统上正常,在另外系统上编译出错。具体宏定义: 原因编译器版本老,不支持新特性。()内的参数不能有##。去掉括号内参数的##,如下:原创 2022-06-14 09:01:27 · 3949 阅读 · 0 评论 -
undefined reference to `major‘
/usr/bin/ld: udev/udevd.o: in function `static_dev_create_from_modules':/home/quantum6/udev-167/udev/udevd.c:829: undefined reference to `makedev'/usr/bin/ld: udev/udevd.o: in function `is_devpath_busy':/home/quantum6/udev-167/udev/udevd.c:512: undefin.原创 2022-04-28 09:46:36 · 2505 阅读 · 3 评论 -
库、dlopen、函数名都正确,dlsym出错了,怎么回事
感觉自己哪里都对:库编译通过,位置也对,dlopen()正确打开库,函数名(比如函数名是mainForMac)也正确,结果到了dlsym出错了,怎么回事?原因 显然,库是c++编译的,实际上函数名在内部已经发行了变化。这个时候mainForMac可能变成了mainForMacZ3之类。当然了,试图使用新的函数名也是错误想法。解决办法 应该这样声明mainForMac:#ifdef __cplusplusextern "C"{#endifint mainForMac(cons原创 2022-03-30 11:11:05 · 1958 阅读 · 0 评论 -
C语言中用二进制输出一个数字
代码也简单:#include <stdlib.h>#include <stdio.h>void output_number_bin(const int number){ char string[16]; itoa(number, string, 2); printf("%d->%s\n", number, string);}原创 2022-03-16 16:28:37 · 744 阅读 · 0 评论 -
实现strrstr,找到子串最后的出现位置
思路:使用strstr,从左向右依次查找,找到最后出现的那个。从右向左找也行(也许更快),实现起来比较麻烦,没有这个易懂。#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h> char* taishan_strrstr(const char *pSrc, const char* pSub){ assert(pSrc); as原创 2022-03-10 16:21:49 · 906 阅读 · 0 评论 -
六石编程学:方便调试输出的标准C代码
以为好像发过,没找到。所以重新写一下。技术说明:LOG系列是纯输出 DEBUG/FILE系列除了输出,还写入到文件 某些情况下输出看不到,或者不方便看,写入文件就是首选。具体用法 比如你要判断某个函数有没有走到,来一句LOG_HERE();,编译后再测试,就可以看到输出。非常的方便。 也可以改进一下,增加时间信息。具体代码#ifndef FT_TS_LOG_FILE_NAME#if defined(_WINDOWS) || defined(WIN32)#define原创 2022-03-09 13:40:12 · 313 阅读 · 0 评论 -
LINUX/MAC的rpath,搜索依赖库时从哪里开始
最近一段时间,因为加载调用各种本地库,在LINUX/MAC上专门研究了rpath问题。最初是想使用全路径方式,这样也能正确执行,有两个缺点:路径太长,不好维护。 安装路径如果变化,就错了。 改进办法是什么?就是使用相对路径,这样搜索加载时基于安装目录下的相对路径,就避免了上述问题。那么相对路径是相对于谁?开始以为,位于同一个目录下的库文件,rpath使用.(当前目录)。结果报错说找不到。后来经过实验,结论是: rpath搜索相对路径时,是从当前执行文件开始。 举例来说:安装目录是A原创 2022-03-01 16:06:37 · 1062 阅读 · 4 评论 -
LINUX C正确遍历environ
遍历容易,就是何时退出循环要处理一下。否则会崩溃。extern char** environ;static void dump_environ(const int argc, const char** argv){ for(int i=0; *environ[i]; i++) { printf("*environ[%d]: %s\n", i, environ[i]); //最后一个参数就是启动程序名。二者的样子也不同:_=./Suite ./原创 2021-12-23 08:30:56 · 289 阅读 · 0 评论 -
X11/XWINDOW GUI窗口应用在任务栏上没有显示的解决办法
范例代码:x11/xwindow GUI窗口代码范例_柳鲲鹏-CSDN博客 吾也奇怪,吾窗口已经显示成功了,结果在任务栏上没有。怎么办?简单,加一句:XStoreName(display, window, DISPLAY_TEXT); 好神奇!是不是马上就出现了?...原创 2021-12-17 14:19:43 · 435 阅读 · 0 评论 -
x11/xwindow GUI窗口代码范例
从别人那里抄的。代码#include <X11/Xlib.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define DISPLAY_TEXT "Taishan Office"void start_window(){ Display *display; Window window; XEvent event; int scr原创 2021-12-17 13:57:07 · 717 阅读 · 0 评论 -
全网首发:LINUX给进程内容窗口改名的第二种方法
上一种方法参考:LINUX给进程改名的代码_柳鲲鹏-CSDN博客 吾在研究过程中看到gtk_init的参数,于是就测试了一下: int nargc = 1; char** nargv = (char**)malloc(sizeof(char**)); nargv[0] = (char*)malloc(32); strcpy(nargv[0], "Taishan Office"); //gtk_init_check(&nargc, &原创 2021-12-17 11:57:37 · 463 阅读 · 0 评论 -
so运行出错:只包含了头文件,未同时编译cpp
同事报怨插件出错。吾就奇怪了,怎么又错了。经过验证,确实。查错的结论也很奇怪:new一个对象出错。 类当然引用其他类,于是进行了清理。还是出错。 新建一个测试类,正常。 测试类改一改,又出错。 最后发现,只有构造函数在头文件中实现才不出错。 到了这里就有点明白了,检查构建脚本,包含了头文件,没有对应的CPP。加上之后解决。...原创 2021-12-02 09:32:29 · 706 阅读 · 0 评论 -
两层循环的中断,注意中断退出
昨天改了点代码,后来简单测试时发现出错了。于是定位到代码。原来代码:while (pos > areaStart && ch != '\n' && ch != '\t'){ pos--;}因为后面的字符判断太多,所以改成了新代码:while (pos > areaStart){ for (char item : SUPPER_FRACTION_CHARS) { if (ch == item)原创 2021-10-12 10:04:20 · 281 阅读 · 0 评论