小编Jér*_*ler的帖子

如何使用cmake创建共享库?

我编写了一个库,我曾经使用自编写的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的非常简单的库,那么我也可以使用它作为一个例子.

c++ compilation cmake shared-libraries

121
推荐指数
4
解决办法
14万
查看次数

gdb:将"next"应用于所选框架而不是最内框架

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.

c linux gdb

8
推荐指数
1
解决办法
450
查看次数

如何在堆栈上分配具有灵活数组成员的结构

假设我们有一个以灵活数组成员结尾的结构:

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()。是内部作用域还是函数?

另外,分配全局变量不起作用(即使这不是我主要关心的问题)。

有人有在堆栈上分配具有灵活数组成员的结构的良好实践吗?

c flexible-array-member

8
推荐指数
2
解决办法
1050
查看次数

在Linux内核中,为什么下半部分无法获取互斥锁?

我正在阅读Linux内核开发,并对互斥锁和信号量之间的差异感到困惑.

作者说:

中断处理程序或下半部分无法获取互斥锁

我知道互斥锁可能会导致睡眠,并且中断处理程序不会在任何特定的进程上下文中运行,因此不允许使用互斥锁或信号量.但是下半部分可以用工作队列实现,它可以睡觉.

那么,为什么下半部分无法获得互斥量呢?简单和效率是关注在这里还是其他什么?

linux synchronization mutex linux-kernel

7
推荐指数
1
解决办法
2811
查看次数

不能将 `git mergetool` 与 `git am` 或 `git apply` 或 `patch` 一起使用

git mergetool很棒(就我而言,我使用 kdiff3)。但是,无法使用它来解决来自git amgit apply(甚至与patch命令)的冲突。实际上,mergetool 在git am使用修改版本和补丁时需要 3 个文件才能工作(基本版本和两个修改版本)。

你知道一种git mergetool用于与产生的冲突的方法git am吗?

我认为有必要从修改版本和补丁中猜测基本文件。如果单独考虑每个块,看起来很棘手,但并非不可能。

patch mergetool git-merge git-am git-apply

6
推荐指数
1
解决办法
419
查看次数