为啥使用gcc编译时总显示找不到文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥使用gcc编译时总显示找不到文件相关的知识,希望对你有一定的参考价值。

参考技术A 修改他安装的默认文件夹名称"c-free5"编译工具不能读取这样的文件名,从路径看5\mingw找不到,那把安装文件目录换的简单点如cfree就能解决问题 参考技术B gcc -o 后面跟输出文件的名字
gcc -o hello hello.c 这样子的
格式不对吧
比如编译hello.c

可以输入:
gcc hello.c -o hello

为啥用brew安装fmt和gcc编译器后找不到fmt库?

【中文标题】为啥用brew安装fmt和gcc编译器后找不到fmt库?【英文标题】:Why is fmt library not found after installing fmt and gcc compiler with brew?为什么用brew安装fmt和gcc编译器后找不到fmt库? 【发布时间】:2019-02-23 07:50:12 【问题描述】:

我使用的是 MACOS Mojave 版本 10.14.3,需要使用 GNU 编译器而不是 clang。

我使用brew install gcc 安装了 gcc 编译器。 然后我使用brew install fmt 安装了 fmt 库。

我将#include <fmt/format.h> 放在我的 C++ 脚本的顶部

然后我输入:

/usr/local/bin/g++-8 -O0 -g3 -Wall -c -fmessage-length=0 -std=c++17 -MMD -MP -MF"src/trail2.d" -MT"src/trail2.o" -o "src/trail2.o" "../src/trail2.cpp"

但是我得到这个错误:

fatal error: fmt/format.h: No such file or directory

当我尝试使用 boost 库时也会发生同样的情况。

当我使用clang时,发现fmt和boost都没有问题。

以防我将 Eclipse IDE 用于 C/C++ 开发人员。版本:2018-12 (4.10.0)。

具体来说,我怎样才能让 fmt 库与我用 brew 安装的 gcc 一起工作?

我的 Mac 中的 /usr/local/Cellar 是:

drwxr-xr-x   3 aaa  staff    96 Feb 22 22:07 gcc
drwxr-xr-x   3 aaa  staff    96 Feb 23 01:58 fmt

我的 Mac 中的 /usr/local/Cellar 是:

    lrwxr-xr-x    1 aaa  admin        29 Feb 22 22:07 c++-8 -> ../Cellar/gcc/8.2.0/bin/c++-8
    lrwxr-xr-x    1 aaa  admin        29 Feb 22 22:07 cpp-8 -> ../Cellar/gcc/8.2.0/bin/cpp-8
    lrwxr-xr-x    1 aaa  admin        29 Feb 22 22:07 g++-8 -> ../Cellar/gcc/8.2.0/bin/g++-8
    lrwxr-xr-x    1 aaa  admin        29 Feb 22 22:07 gcc-8 -> ../Cellar/gcc/8.2.0/bin/gcc-8

感谢高级的帮助

【问题讨论】:

这不是 GCC 的问题,而是安装了 library 的问题。如果它没有安装在“标准”位置,您必须告诉g++ 前端程序在哪里可以找到头文件和库文件。使用 -I(大写 i)选项指定头文件的安装位置,并使用 -L-l(小写 L)选项指定任何链接器库。 我猜是/usr/local/include and /usr/local/lib 考虑到/usr/local/Cellar的内容,我的猜测是你需要添加-I/usr/local/Cellar。因为我不知道brew 在安装时如何组织它的包,也许像-I/usr/local/Cellar/fmt/include 这样的东西?您可以在 Eclipse 项目设置中的某处添加目录(预处理器设置选项卡或类似选项?),但通常没有实际的 -I 选项。 嗨。我是 C++ 的新用户。你能帮我看看我的 g++ 命令行应该是什么样子吗?在/usr/local/lib 我有这个:lrwxr-xr-x 1 aaa admin 32 Feb 23 01:58 libfmt.a -> ../Cellar/fmt/5.3.0/lib/libfmt.a 我的回答解决了你的问题吗?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步为您提供帮助。谢谢。 meta.stackexchange.com/questions/5234/… 【参考方案1】:

homebrew 的工作方式是将所有内容放入

/usr/local/Cellar/PACKAGE-NAME/PACKAGE-VERSION

然后它为/usr/local/bin 中的二进制文件创建指向这些内容的链接,例如

/usr/local/bin/grep -> /usr/local/Cellar/grep/4.17/bin/grep

因此您只需将/usr/local/bin 放入您的 PATH 中,所有 homebrew 程序都可以按名称运行,例如grep 在上面的例子中。


它在编译时做同样的事情,它把实际的头文件和库放在:

/usr/local/Cellar/PACKAGE-NAME/PACKAGE-VERSION/include
/usr/local/Cellar/PACKAGE-NAME/PACKAGE-VERSION/lib

并创建链接到那些在

/usr/local/include
/usr/local/lib

所以,您的gcc 命令将是:

g++-8 -I /usr/local/include -L /usr/local/lib -lfmt <PROGRAM.CPP> -o <PROGRAM>

您可以查看哪些文件属于您的 fmt 包以及它们所在的位置:

brew ls fmt --verbose

如果你安装pkg-config,使用:

brew install pkg-config

它将使用文件fmt.pc,如果您键入,它会告诉您正确的编译开关:

pkg-config --libs --cflags fmt

样本输出

-I/usr/local/Cellar/fmt/5.3.0/include -L/usr/local/Cellar/fmt/5.3.0/lib -lfmt

这意味着您可以将gcc 命令简化为:

g++-8 $(pkg-config --libs --cflags fmt) <PROGRAM.CPP> -o <PROGRAM>

【讨论】:

以上是关于为啥使用gcc编译时总显示找不到文件的主要内容,如果未能解决你的问题,请参考以下文章

为啥 GCC 交叉编译器找不到所有库?

java编译 为啥显示找不到文件

Java和Javac的使用时总提示找不到类模块的解决方案

gcc找不到静态库中的函数

gcc编译文件时找不到指定函数怎么办

gcc 编译时总是找不到系统的.h文件,高手帮忙啊