【问题标题】:g++ compiling error: std::ctype<char>, std::__detail, std::allocator<Taquartg++ 编译错误: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 正确编译?不完全是您的应用程序,但请查看 stackoverflow.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 文件。一旦这些被删除,我就可以编译程序并发出一个小警告。感谢您的宝贵时间!

标签: c++


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我假设每次运行 make clean 后都会在 Makefile 中删除 *.o 文件。事实证明,事实并非如此。否则我不会移植文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
相关资源
最近更新 更多