首页 > 解决方案 > C pthread 包括头文件并与 -nolibc 链接

问题描述

这个例子:

#include <stdio.h>
#include <pthread.h>

__attribute__((weak)) int pthread_create( pthread_t*, const pthread_attr_t*,
    void*(*)(void*), void*);

int main()
{
    if (pthread_create)
    {
        printf("This is multi-thread version!\n");
    }
    else
    {
        printf("This is single-thread version!\n");
    }
    return 0;
}

它说如果没有链接到 pthread 库,它将以单线程模式运行,但#include pthread如果正常编译,它不会被链接吗?
我认为pthreadglibc或者libc但首先有一种方法可以链接不包括标准库,如果是这样,你什么时候这样做?
如果有可以在多线程模式下运行的代码,那么在示例中以单线程模式运行它是否有任何意义,或者这只是一个坏例子?如果是这样,作为弱符号硬编码的更好例子是什么?

标签: csymbols

解决方案


但是如果正常编译,#include pthread 是否会被链接?

不,包含头文件与链接库不同。

我认为 pthread 在 glibc 或 libc

它不是。

有没有办法链接不包括标准库

检查您的编译器文档。gcc许多链接选项,例如-nolibc -nostdlib nodefaultlibs.

如果是这样,你什么时候这样做?

当我为一个确实没有 C 库的裸机目标进行编译时。当我编写自己的标准库或者我想使用不同的 C 库时,默认的库是随系统分发的,或者在交叉编译时,我在自定义位置有一个自定义 C 库,而系统不附带交叉编译器。等等。

如果有可以在多线程模式下运行的代码,那么在单线程模式下运行它有什么意义呢?

是的。由于某些原因,与单线程相比,多线程会导致性能更差,例如在单核系统上。如果一个实时进程无论如何都拥有cpu。或者,如果特定算法不能是多线程的,或者在多线程时会导致性能下降。


推荐阅读