我一直在用这个命令行构建这个未定义的符号:
$ gcc test.cpp
Undefined symbols:
"___gxx_personality_v0", referenced from:
etc...
test.cpp 很简单,应该可以正常构建。什么是交易?
采用
g++ test.cpp
相反,因为这是 C++ 代码。
或者,如果您真的想使用gcc
,请添加-lstdc++
到命令行,如下所示:
gcc test.cpp -lstdc++
在每个场景下运行产生md5
的a.out
结果表明它是相同的输出。
但是,是的,g++
可能会让你的世界变得更简单。
该.cpp
扩展会导致gcc
将您的文件编译为 C++ 文件。(请参阅GCC 文档。)
尝试编译相同的文件,但将其重命名为具有.c
扩展名:
mv test.cpp
gcc test.c
-x c
或者,您可以通过传递给编译器来显式指定语言:
gcc -x c -c test.cpp -o test.o
如果您nm test.o
在这些 C 语言版本上运行,您会注意到它___gxx_personality_v0
没有作为符号列出。
(如果您在使用 生成的目标文件上运行相同的命令gcc -c test.cpp -o test.o
,则该___gxx_personality_v0
符号存在。)
以防万一有人和我有同样的问题:文件扩展名应该.c
不是 a .C
(gcc 区分大小写)。
有同样的问题,但有不同的解决方案:
静态库中的 C++ 代码被链接,并被 .m 文件引用。将 .m 文件重命名为 .mm 可解决此问题。