c - 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
如果正常编译,它不会被链接吗?
我认为pthread
是glibc
或者libc
但首先有一种方法可以链接不包括标准库,如果是这样,你什么时候这样做?
如果有可以在多线程模式下运行的代码,那么在示例中以单线程模式运行它是否有任何意义,或者这只是一个坏例子?如果是这样,作为弱符号硬编码的更好例子是什么?
解决方案
但是如果正常编译,#include pthread 是否会被链接?
不,包含头文件与链接库不同。
我认为 pthread 在 glibc 或 libc
它不是。
有没有办法链接不包括标准库
检查您的编译器文档。gcc
有许多链接选项,例如-nolibc
-nostdlib
nodefaultlibs
.
如果是这样,你什么时候这样做?
当我为一个确实没有 C 库的裸机目标进行编译时。当我编写自己的标准库或者我想使用不同的 C 库时,默认的库是随系统分发的,或者在交叉编译时,我在自定义位置有一个自定义 C 库,而系统不附带交叉编译器。等等。
如果有可以在多线程模式下运行的代码,那么在单线程模式下运行它有什么意义呢?
是的。由于某些原因,与单线程相比,多线程会导致性能更差,例如在单核系统上。如果一个实时进程无论如何都拥有cpu。或者,如果特定算法不能是多线程的,或者在多线程时会导致性能下降。
推荐阅读
- c# - 在 EF Core 5 中保存相关数据(多对多)而不获取实际记录
- jenkins - 从 AWS 管道发起的 Jenkins 上的作业轮询问题
- azure - Azure 日志分析查询 vm 消耗了多少和哪些数据
- java - 输入输出、方法调用和栈帧
- ios - 另一个类 ios swift 中的函数未执行
- azure-devops - 在 Azure Devops 中将测试用例导出为 CSV
- r - 如何从一个数据框中获取属性并将其添加到另一个
- powerbi - 如何在 Power BI 报告中模糊所需的视觉对象以进行第一页加载
- c - 为什么下面的代码一直打印 value10?
- docker - 我的网络打开了女巫 docker-compose.yml 但不是我的 dockerfile