【发布时间】:2020-02-16 20:58:09
【问题描述】:
我有一个适用于 macOS 和 Linux 的 makefile,其中包含以下命令:
cc -std=c++14 foo.cpp bar.cpp
它编译得很好。 foo.cpp 和 bar.cpp 顾名思义是 C++ 文件,它包含 C++11 语法。编译工作正常。
现在,如果我包含<fstream>,我会收到数百个链接器错误。我想知道,这是为什么呢?
Undefined symbols for architecture x86_64:
"std::__1::locale::has_facet(std::__1::locale::id&) const", referenced from:
bool std::__1::has_facet<std::__1::codecvt<char, char, __mbstate_t> >(std::__1::locale const&) in DiceInvaders-6f5dd4.o
"std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
...
Afaik,cc 链接到 c 编译器,我假设由于它是自动检测的,它使用 C++ 编译器编译它。但是为什么它会因额外的 C++ 包含而失败?
系统上是否有cc 对应的c++?如果我使用g++,我会假设该命令可用,如果用户真的想用他喜欢的编译器(如cc)编译它怎么办?
编辑:$(CXX) 是 cc 的良好替代品吗?
【问题讨论】:
-
Clang 的命令是 clang++。
-
$(CXX)看起来像构建脚本中的变量,而不是编译器的名称。您可能会在某个地方找到$(CXX)=cc将编译器设置为cc,然后脚本的其余部分愉快地使用$(CXX)并获取CXX包含的任何内容。这样,无论有多少不同的规则使用编译器,您只需更改一次编译器。 -
我有点困惑为什么当前提供的答案没有帮助。如果你只是用
c++替换cc会发生什么?例如编译/链接命令应该是c++ -std=c++14 foo.cpp bar.cpp. -
@G.M.因为 c++ 并不在所有系统上
-
好的,所以如果您需要可以保证在所有平台上工作的东西(或者如果不能,则失败),那么您可能应该接受@KamilCuk 的建议并使用
cmake之类的东西。话虽如此,在macos和任何linux框中,我使用过cc和c++分别指的是默认的C和C++编译器。