提问人:Jean-Philippe Leclerc 提问时间:9/24/2011 最后编辑:jwwJean-Philippe Leclerc 更新时间:9/3/2019 访问量:58048
编译一些简单的 c++ 代码时出错
Error when compiling some simple c++ code
问:
我尝试在 osx lion 上编译此 cpp 代码,但出现错误。
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
for(int i = 0; i < 10; i++)
{
cout << "hi";
cout << endl;
}
return 0;
}
要编译:
cc main.cpp
错误:
Undefined symbols for architecture x86_64:
"std::cout", referenced from:
_main in ccBdbc76.o
"std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
_main in ccBdbc76.o
"std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
_main in ccBdbc76.o
"std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from:
_main in ccBdbc76.o
"std::ios_base::Init::Init()", referenced from:
__static_initialization_and_destruction_0(int, int)in ccBdbc76.o
"std::ios_base::Init::~Init()", referenced from:
___tcf_0 in ccBdbc76.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
答:
我不熟悉OSX LION。但是,从最严格的意义上讲,所描述的错误不是由编译器引起的,而是由链接器引起的。似乎没有链接标准库。
通常,通过调用 C 前端编译 C++ 代码时会发生此类故障。执行的 理解文件并将其编译为 C++,但不将其与 C++ 库链接。例:gcc
$ gcc example.cpp
Undefined symbols for architecture x86_64:
"std::cout", referenced from:
_main in ccLTUBHJ.o
"std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
_main in ccLTUBHJ.o
"std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
_main in ccLTUBHJ.o
"std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from:
_main in ccLTUBHJ.o
"std::ios_base::Init::Init()", referenced from:
__static_initialization_and_destruction_0(int, int)in ccLTUBHJ.o
"std::ios_base::Init::~Init()", referenced from:
___tcf_0 in ccLTUBHJ.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
$ g++ example.cpp
$
如您所见,使用可以使问题消失。如果您使用(我建议这样做),则会出现相同的行为(消息略有不同):g++
clang
$ clang example.cpp
Undefined symbols for architecture x86_64:
"std::ios_base::Init::~Init()", referenced from:
___cxx_global_var_init in cc-IeV9O1.o
"std::ios_base::Init::Init()", referenced from:
___cxx_global_var_init in cc-IeV9O1.o
"std::cout", referenced from:
_main in cc-IeV9O1.o
"std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
_main in cc-IeV9O1.o
"std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
_main in cc-IeV9O1.o
"std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from:
_main in cc-IeV9O1.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
$ clang++ example.cpp
$
正如您在错误消息中看到的那样,您可以使用链接器调用来查看出了什么问题。它会向你显示这个链接行:clang
-v
"/usr/bin/ld" -demangle -dynamic -arch x86_64
-macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o
/var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-hdOL8Z.o
-lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a
或者类似的东西 - 正如你所看到的,它链接的是 C 运行时,而不是 C++,也没有 C++ 库。使用链接行是:clang++
"/usr/bin/ld" -demangle -dynamic -arch x86_64
-macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o
/var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-wJwxjP.o
/usr/lib/libstdc++.6.dylib -lSystem
/Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a
如您所见,包括在内,并且 presto - 没有链接错误。libstdc++
评论
other.c
clang
clang main.c
clang main.c other.c
#include "other.h"
main.c
使用 CC 命令(大写)编译 C++ 并链接到标准 C++ 库。
这是 Windows 上的 GCC (MinGW) 还是 Linux?在 MinGW 上,您需要参数 。Linux 可能需要类似的东西,很可能是需要的。-lmingw32 -enable-auto-import
-enable-auto-import
评论
尝试
g++ main.cpp
这样它应该可以工作,至少使用 OS X
从优胜美地 (10.10.1) 开始,我发现使用标志也可以:gcc
-lc++
gcc -lc++ main.cpp
如果在OS X上使用clang,请尝试:
clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out
以下是适用于 macOs Sierra 的解决方案:
OS X 上提供了两种标准 C++ 库的实现:libstdc++ 和 libc++。它们不兼容二进制,libMLi3 需要 libstdc++。
在 10.8 及更早版本上,默认选择 libstdc++,在 10.9 上,默认选择 libc++。为了保证与 libMLi3 的兼容性,我们需要手动选择 libstdc++。
为此,请将 -stdlib=libstdc++ 添加到链接命令中。
因此,错误 ld: library not found for -lstdc++ 是实际错误所在。
若要解决此问题,请打开文件夹
打开 /Library/Developer/CommandLineTools/Packages/
运行软件包 macOS_SDK_headers_for_macOS_10.14.pkg
那么 gem install mini_racer 就可以工作了!
这个问题可能不仅与mini_racer有关,因为它可能会影响任何编译扩展的gem。
评论