我正在尝试编写并运行我的C程序。该程序使用线程。我正在使用WSL和Ubuntu终端运行Windows 10。 (也可以在Ubuntu虚拟机上尝试)这是我所有程序使用的“默认” Makefile格式(为每个程序更改名称和标志)
CC=gcc
CFLAGS=-I. -w -pthread
DEPS = v1.h
version1: v1
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
v1: v1.o
$(CC) -o v1 v1.o
这是我第一次在C中使用线程,这导致我发现-pthread。我发现您需要将其添加到标志(我对CFLAGS所做的)。由于某些原因,当我在上面运行此makefile时,出现错误,未找到pthread函数,并且我注意到通过更改以下行来修复它:
$(CC) -o v1 v1.o -pthread
在末尾添加pthread。所有这些使我对标志进行了一般的研究,在搜索了gcc的手册页和google之后,我发现这些问题没有简单的答案:
谢谢。
正在进行中,请耐心等待。
按照man gcc
:
-pthread添加了对pthreads库的多线程支持。此选项设置预处理器和链接器的标志。
您需要同时为Makefile的编译器和链接器部分指定-pthread
选项:
CC=gcc
CFLAGS=-I. -w -pthread
LDLAGS=-pthread
DEPS = v1.h
version1: v1
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
v1: v1.o
$(CC) -o v1 v1.o $(LDLAGS)
为什么我需要在-o任务和.c任务中添加-pthread?
因为使用了posix线程库中的函数。
为什么不足够地将它添加到一个?
因为编译器(将.c
编译为.o
的程序)和链接器(将多个.o
链接为可执行文件的链接器)都需要了解这些功能。编译器检查函数是否在库中存在,并且链接程序将您在代码中使用的正确函数连接到库中的符号。
什么是-w标志?
来自man gcc:
-w禁止所有警告消息。
请不要使用-w
。通常是使用-Wall -Wextra
启用所有可能的警告并在编译时捕获尽可能多的问题。
我知道它代表“警告”,但-w和-Wall之间的区别是什么?
[-w
禁用警告,-Wall
启用指定的警告列表。
什么是-I。标志?
来自man gcc
:
-I目录
将目录dir添加到要搜索的目录列表中用于预处理期间的头文件。
它将目录添加到预处理器的搜索路径。预处理的工作之一是找到#include <this files are>
。 #include
语句中的文件在“预处理程序搜索路径”中搜索。 -I
将路径添加到此列表。