我编写了一个库,我曾经使用自编写的Makefile进行编译,但现在我想切换到cmake.树看起来像这样(我删除了所有不相关的文件):
.
??? include
? ??? animation.h
? ??? buffers.h
? ??? ...
? ??? vertex.h
? ??? world.h
??? src
??? animation.cpp
??? buffers.cpp
??? ...
??? vertex.cpp
??? world.cpp
Run Code Online (Sandbox Code Playgroud)
所以我要做的只是将源代码编译成共享库,然后使用头文件安装它.
我发现的大多数示例都使用一些共享库编译可执行文件,但从不只是一个普通的共享库.如果有人可以告诉我一个使用cmake的非常简单的库,那么我也可以使用它作为一个例子.
在gdb,当你运行next命令.它适用于最内层的帧而不是选定的帧.如何要求gdb在所选框架的下一行中断?
举个例子:
在子函数中设置断点:
(gdb) b subfunc
Breakpoint 1 at 0x400f09: file prog.c, line 94.
(gdb) c
Continuing.
Breakpoint 1 at 0x400f09: file prog.c, line 94.
94 void subfunc() {
Run Code Online (Sandbox Code Playgroud)
更改所选框架:
(gdb) up
#1 0x0000000000400f7e in main (argc=1, argv=0x7fffffffe468) at prog.c:70
70 subfunc();
Run Code Online (Sandbox Code Playgroud)
我想停在第71行prog.c:
(gdb) n
95 i = 0;
Run Code Online (Sandbox Code Playgroud)
......但它停止了第95行prog.c.
假设我们有一个以灵活数组成员结尾的结构:
struct foo {
size_t len;
uint8_t data[];
};
Run Code Online (Sandbox Code Playgroud)
如何在堆栈上分配这个结构(即内存在作用域结束时自动释放)?另外,如果len能包含字段的大小就更好了data。
目前,我做的事情如下:
uint8_t buf[256];
struct foo *foo = (struct foo *)buf;
foo->len = sizeof(buf) - sizeof(struct foo);
Run Code Online (Sandbox Code Playgroud)
然而,它很容易出错。使用alloca()可能会稍微好一点:
struct foo *foo = alloca(256 + sizeof(struct foo));
foo->len = 256;
Run Code Online (Sandbox Code Playgroud)
从那里,我可以定义一个像这样的宏:
#define STACK_ALLOC_FOO(SIZE) ({ \
struct foo *_tmp = alloca(SIZE + sizeof(struct foo)); \
_tmp->len = SIZE; \
_tmp; \
})
Run Code Online (Sandbox Code Playgroud)
并声明它:
struct foo *foo = STACK_ALLOC_FOO(256);
Run Code Online (Sandbox Code Playgroud)
但是,我不确定分配的内存的生命周期alloca()。是内部作用域还是函数?
另外,分配全局变量不起作用(即使这不是我主要关心的问题)。
有人有在堆栈上分配具有灵活数组成员的结构的良好实践吗?
我正在阅读Linux内核开发,并对互斥锁和信号量之间的差异感到困惑.
作者说:
中断处理程序或下半部分无法获取互斥锁
我知道互斥锁可能会导致睡眠,并且中断处理程序不会在任何特定的进程上下文中运行,因此不允许使用互斥锁或信号量.但是下半部分可以用工作队列实现,它可以睡觉.
那么,为什么下半部分无法获得互斥量呢?简单和效率是关注在这里还是其他什么?
git mergetool很棒(就我而言,我使用 kdiff3)。但是,无法使用它来解决来自git am或git apply(甚至与patch命令)的冲突。实际上,mergetool 在git am使用修改版本和补丁时需要 3 个文件才能工作(基本版本和两个修改版本)。
你知道一种git mergetool用于与产生的冲突的方法git am吗?
我认为有必要从修改版本和补丁中猜测基本文件。如果单独考虑每个块,看起来很棘手,但并非不可能。