几个基本的GCC标志问题

问题描述 投票:-1回答:2

我正在尝试编写并运行我的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之后,我发现这些问题没有简单的答案:

  1. 为什么我需要在.o任务和.c任务中添加-pthread?为什么它不能“足够”添加到仅一个?
  2. 什么是-w标志?我知道它代表“警告”,但-w和-Wall之间的区别是什么?
  3. 什么是-I。旗?再次,我发现它代表“ include”,但是我不确定它在做什么。我的makefile可以使用或不使用该标志。

谢谢。

c linux gcc compiler-flags linker-flags
2个回答
1
投票

正在进行中,请耐心等待。


1:为什么我需要在-o任务和.c任务中添加-pthread?为什么它不能“足够”添加到仅一个?

按照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)

0
投票

为什么我需要在-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将路径添加到此列表。

© www.soinside.com 2019 - 2024. All rights reserved.