在 Mac 上,默认情况下,g++(clang)无法搜索 /usr/local/include 和 /usr/local/lib。

42

我使用 homebrew 在我的 Mac 上安装了 gmp

Kyumins-iMac:gcjlib math4tots$ g++ main.cpp -lgmp -lgmpxx
In file included from main.cpp:2:
./gcjlib.hpp:4:10: fatal error: 'gmpxx.h' file not found
#include <gmpxx.h>
         ^
1 error generated.

那么我明确告诉g++使用/usr/local/include

Kyumins-iMac:gcjlib math4tots$ g++ main.cpp -lgmp -lgmpxx -I/usr/local/include
ld: library not found for -lgmp
clang: error: linker command failed with exit code 1 (use -v to see invocation)

那么我明确地告诉了 g++ 使用 /usr/local/lib

Kyumins-iMac:gcjlib math4tots$ g++ main.cpp -lgmp -lgmpxx -I/usr/local/include -L/usr/local/lib
Kyumins-iMac:gcjlib math4tots$ ./a.out 
sum is -4444
absolute value is 4444

所以唯一的问题似乎是 g++ 无法识别 /usr/local

但每次都输入这么多很麻烦,特别是当我只写小的单文件程序时。

有没有办法让 g++ 默认识别 /usr/local 中的内容?homebrew 用户有没有标准的方法做到这一点?


我使用的是OS X 10.9.3和Xcode 5.1.1,如果相关的话。


使用Makefile怎么样? - Mark Setchell
7
请停止使用 "g++" 这个名称,你所调用的程序实际上是 "clang++"(由苹果提供的一个令人困惑的别名)。你的问题与 gcc 无关。如果你安装了真正的 gcc,它很可能会按照你的预期工作。 - Marc Glisse
在10.12.6中,"$ sudo rm -rf Applications/Xcode.app" 对我起了作用。 - user1114056
你可以使用 g++ --version 命令来查看你正在运行的版本。 - Richard
7个回答

62

我也使用了Homebrew,在Mac OSX Maverick 10.9.5和Xcode 6.0.1上遇到了类似的问题,但是通过运行以下命令来解决:

xcode-select --install

请注意,如果不使用前面回答中提供的双破折号,则该命令不起作用。这将安装命令行工具,还会创建/usr/lib//usr/include/目录。我不知道为什么Homebrew在安装时不自动检查此内容,因为它确实会检查Xcode...

如果您想要准确检查编译器用于查找头文件的所有文件夹,可以键入以下命令:

cpp -v


1
我的英雄!我已经苦思冥想了16个小时,只用一行代码就解决了。 - Antonio Ribeiro
很难理解为什么苹果公司会停止默认搜索 /usr 和 /usr/local,但无论如何,这也解决了我的一些构建问题。 - Weston C
真正的英雄在那里! - Valentin Mercier
我猜你的意思是:这将安装命令行工具,也会搜索/usr/lib//usr/include/ - Martijn Courteaux

17

一个解决方法是:

export C_INCLUDE_PATH=/usr/local/include
export CPLUS_INCLUDE_PATH=/usr/local/include

至少这样骗过了预处理器在这里的行为 :)


1
这对我编译 nginx 有效,尽管 openssl/ssl.h 位于 /opt/local/include,所以我使用了那个路径。 - Josh Wulf
LIBRARY_PATH导出可能也很有用。 - John Perry
使用cmake, include_directories(/usr/local/include) 也可以工作。 - dB.

11

尝试运行xcode-select --install

至少在Mavericks上,我发现如果我安装了Xcode应用程序但是没有安装命令行工具,则工具似乎是可用的,但普通的Unix构建不会正常工作。其中一个症状是/usr/local/include不在包含搜索路径中。命令行工具似乎解决了这个问题。


2
我有Yosemite 10.10.5,并且运行xcode-select --install并没有解决我的问题。该命令返回xcode-select: error: command line tools are already installed, use "Software Update" to install updates
当我运行xcode-select -p时,它显示/Applications/Xcode.app/Contents/Developer。最终我删除了应用程序目录中的Xcode,这导致xcode-select -p返回/Library/Developer/CommandLineTools。这为我解决了编译器错误。

当我尝试这样做时,clang无法再找到一些重要的标准库文件。 - John Perry
3
从这个回答中不清楚问题是如何解决的,如果删除Xcode,所有编译器都会被删除。对于看到这个消息的人,请勿尝试。 - 1a1a11a
如果您已经安装了命令行工具,就不需要安装Xcode。 - Sonny Parlin

2

对我来说非常有帮助:

使用最新版本。 1.0.2o_1 只是一个当前版本。

brew install openssl
ln -s /usr/local/Cellar/openssl/1.0.2o_1/include/openssl /usr/local/include/openssl
ln -s /usr/local/Cellar/openssl/1.0.2o_1/lib /usr/local/lib/openssl

1

关于这个主题有一些问题,答案建议在/usr/local/include中放置符号链接。然而,我正在运行macOS Monterey 12.3(在M1 MacBook上),该目录不存在。

我通过从Apple下载软件包安装了Xcode命令行工具,因此xcode-select --install告诉我已经安装,并且不会创建任何目录。

我运行了cpp -v来查看搜索哪些目录以包含#include <...>

 /Library/Developer/CommandLineTools/usr/lib/clang/13.1.6/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
 /Library/Developer/CommandLineTools/usr/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)

我选择了 /Library/Developer/CommandLineTools/usr/include 作为符号链接的目录。在该目录下,我运行了以下命令(请注意 Homebrew 安装的新位置,在 /opt/homebrew 下 - 一些旧的答案在这一点上也已经过时):

sudo ln -s /opt/homebrew/opt/openssl@3/include/openssl .

clang 然后能够找到 OpenSSL 文件。


-1

apk add --no-cache build-base 它工作得很好!!!! go build -tags musl -o main main.go


目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接