【问题标题】:Few basic GCC flag questions [closed]几个基本的 GCC 标志问题[关闭]
【发布时间】:2020-09-11 23:18:15
【问题描述】:

我正在尝试编译和运行我的 C 程序。该程序使用线程。 我正在使用带有 Ubuntu 终端的 WSL 运行 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 的手册页和谷歌之后,我发现这些问题没有简单的答案:

  1. 为什么我需要将 -pthread 添加到 .o 任务和 .c 任务?为什么仅将其添加到一个还不够?
  2. 什么是-w 标志?我知道它代表“警告”,但 -w 和 -Wall 有什么区别?
  3. 什么是-I。旗帜?同样,我发现它代表“包含”,但我不确定它在做什么。我的 makefile 可以使用或不使用该标志。

谢谢。

【问题讨论】:

  • C 现在还没有原生线程吗?从 C11 开始?
  • @MSalters 我的 gcc 是 7.4.0 版。如何检查/更改我的 C 版本?
  • 请注意,这是一个针对每个问题的特定问题的论坛,而不是多个问题。我相信这个论坛也非常感谢提问者为找到他们问题的答案所做的工作——我相信你的一些问题可以很容易地在互联网和你的编译器文档中找到。 On-topichow-to-ask 是有用的资源。
  • 同意@KamilCuk。 OP,flag相关问题很容易找到,下次请慢慢来。不过,第一个问题是有道理的,因为对于第一次处理这个问题的人来说,它可能需要一些详细说明。

标签: c linux gcc compiler-flags linker-flags


【解决方案1】:

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

根据man gcc

-pthread 使用 pthreads 库添加对多线程的支持。此选项为预处理器和链接器设置标志。

您需要为 Makefile 的编译器和链接器部分指定 -pthread 选项:

CC=gcc
CFLAGS=-I. -w -pthread
LDFLAGS=-pthread
DEPS = v1.h
version1: v1

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

v1: v1.o
    $(CC) -o v1 v1.o $(LDFLAGS)

2:什么是-w标志?我知道它代表“警告”,但 -w 和 -Wall 有什么区别?

查看gccwarning options信息。

-w
    Inhibit all warning messages.
-Wall
    This enables all the warnings about constructions that some users consider
    questionable, and that are easy to avoid (or modify to prevent the
    warning), even in conjunction with macros. This also enables some
    language-specific warnings described in C++ Dialect Options and
    Objective-C and Objective-C++ Dialect Options. 
-Wextra
    This enables some extra warning flags that are not enabled by -Wall.
    (This option used to be called -W. The older name is still supported,
    but the newer name is more descriptive.) 

基本上,-w 会禁用所有警告。请谨慎使用。我建议你改用-Wall

3:什么是-I。标志?

查看gccoptions for directory search信息。

-I dir
-iquote dir
-isystem dir
-idirafter dir
    Add the directory dir to the list of directories to be searched for
    header files during preprocessing.

您的 Makefile 中的-I. 选项指示编译器也在 Makefile 目录中查找头文件。 . 在 Linux 世界中代表 当前目录

【讨论】:

  • 谢谢。是 LDFLAGS 还是 LDFLAGS? LLDLAGS 代表什么?我不知道我可以为编译和链接指定不同的标志,现在这很有意义。
  • @Birkagal 修正错字。
  • 非常感谢真正帮助我的朋友。我很抱歉问了一些“愚蠢的问题” ”。但我真的很欣赏你的回答。关于-I.的最后一个问题,在这种情况下没有意义吗?编译器会自动知道在“this”(.) 文件夹中搜索标题,对吗?再次感谢回答的朋友!
  • 老实说,我不确定-I.,但我认为编译器也会在没有此选项的情况下在当前目录中查找头文件。不客气!
【解决方案2】:

为什么我需要在 .o 任务和 .c 任务中添加 -pthread?

因为您使用 posix 线程库中的函数。


为什么只将它添加到一个“不够”?

因为编译器(将.c 编译为.o)和链接器(它将多个.o 链接到一个可执行文件中)都需要了解这些函数。编译器检查函数是否存在于库中,链接器将您在代码中使用的正确函数连接到库中的符号。


什么是-w标志?

来自man gcc

-w 禁止所有警告信息。

请不要使用-w。通常是使用-Wall -Wextra 来启用所有可能的警告并在编译时捕获尽可能多的问题。


我知道它代表“警告”,但 -w 和 -Wall 有什么区别?

-w 禁用警告,-Wall 启用 specified list of warnings


什么是-I。标志?

来自man gcc

-我的目录

将目录dir添加到要搜索的目录列表中 用于预处理期间的头文件。

它将目录添加到预处理器的搜索路径中。预处理的工作之一是找到#include &lt;this files are&gt; 的位置。 #include 语句中的文件在“预处理器搜索路径”中搜索。 -I 将路径添加到此列表。


是 LDFLAGS 还是 LDFLAGS?

来自makefile manualLDFLAGS....

LDFLAGS 代表什么?

ld 标志。


旁注:This is my "default" Makefile format im using for all my programsmake 是一位老爷爷——已经 40 多岁了。我建议学习一个在当今世界更容易处理的build system,比如cmake

【讨论】:

  • 感谢您的详尽回答。我知道其中一些问题是“愚蠢的”,但我真的尝试先在 gcc 手册页上寻找答案,但由于我搜索了“/-w”而不是“/-w”(注意空格),我发现很多不是我一直在寻找答案。所以再次感谢这个很棒的答案,它真的让我头脑中的一些事情变得清晰。关于侧节点的最后一件事,Makefile 是我老师的要求,但我一定会尝试查找 cmake 以了解我自己的知识。
  • 是的,当然,谷歌在搜索带有前导减号的关键字时很糟糕 - 它将其解释为“排除”条件。我通常只搜索没有减号,例如 gcc "Wall" 有时可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
相关资源
最近更新 更多