g++ 编译错误:std::ctype<char>、std::__detail、std::allocator<Taquart

Posted

技术标签:

【中文标题】g++ 编译错误:std::ctype<char>、std::__detail、std::allocator<Taquart【英文标题】:g++ compiling error: std::ctype<char>, std::__detail, std::allocator<Taquart 【发布时间】:2018-02-21 11:13:20 【问题描述】:

我正在尝试在 OS X 10.8.5 上编译使用外部库 (cairo) 的 C++ 程序。以前,同样的程序在 Linux 上编译成功。不幸的是,我似乎无法编译程序,并出现以下错误。虽然我尝试了几件事,但我现在没有解决方案。我正在使用 llvm-g++-4.2。非常感谢任何有助于解释正在发生的事情和解决此问题的帮助。谢谢!

g++ -O3 -Wall moment_tensor.cpp -o focimt getopts.o faultsolution.o 
focimtaux.o inputdata.o timedist.o traveltime.o usmtcore.o 
trinity_library.o -L/opt/local/lib/ -lcairo    

Undefined symbols for architecture x86_64:    
"std::ctype<char>::_M_widen_init() const", referenced from:    
              Options::showHelp(char*) in getopts.o
"std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)", 
referenced from:    
      TransferSolution(Taquart::SolutionType,std::list<Taquart::FaultSolution,
std::allocator<Taquart::FaultSolution> >&)in usmtcore.o    
ld: symbol(s) not found for architecture x86_64   
collect2: ld returned 1 exit status
make: *** [focimt] Error 1

【问题讨论】:

也许 usmtcore.o 和 getopts.o 库没有为 x86_64 正确编译?不完全是您的应用程序,但请查看 ***.com/questions/29607258/… 谢谢!但这些是子程序,我怀疑它们是个问题。 ld: symbol(s) not found for architecture x86_64 看起来他们是个问题 到目前为止,我的猜测是这些子例程中使用的 showHelp 和 TransferSolution 不在我的 g++(4.2 版)标准库中。不幸的是,我认为我拥有的 OS X 10.8.5 不允许我进一步升级 g++。 事实证明,我犯了一个错误,没有从 Linux 机器上的先前编译中删除 *.o 文件。一旦这些被删除,我就可以编译程序并发出一个小警告。感谢您的宝贵时间! 【参考方案1】:

您似乎从另一个平台复制/粘贴了二进制文件。这些二进制文件(可能是.o 文件)是针对不同的标准库实现编译的。当尝试在新平台上将所有内容链接在一起时,符号与 this 平台的标准库实现内部不匹配,因此您的链接器会抱怨。

实际上,您很幸运:如果符号仅在名称上匹配,您可能会遇到细微的运行时错误。

永远不要像这样移植二进制文件。在目标系统或相同平台上编译所有内容。不要将二进制文件存储在版本控制中。

【讨论】:

谢谢,我假设每次运行 make clean 后都会在 Makefile 中删除 *.o 文件。事实证明,事实并非如此。否则我不会移植文件。

以上是关于g++ 编译错误:std::ctype<char>、std::__detail、std::allocator<Taquart的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu20.04 18.04编译视觉SLAM十四讲slambook2/ch5/imageBasics/

编译FFMPEG时Mac上的g ++链接错误

C ++,g ++编译错误函数

当用户在 unordered_map 中自定义哈希函数时,无法解码 g++ 中的模糊编译器错误

在 Windows 上使用 g++ 编译 C++ 后出现 __gxx_personality_v0 错误

2022-09-10:以下go语言代码输出什么?A:编译错误;B:49.0;C:49。 package main import ( “fmt“ ) func main() { ch