1

在 OS X 10.8.2(Mountain Lion)上,我正在尝试使用 libc++(不是 libstdc++)链接一个程序,并ld给我一个未解决的符号错误。

Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(char const*)", referenced from:
      bool process_load_commands<mytype_t>(unsigned char*, ...) in module_mach_o.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这似乎是指以下行的代码生成:

mystdstring = ::std::string(mycharpointer + myint);

如果我将其更改为

mystdstring = mycharpointer + myint;

然后一切正常,因为我们停止使用移动构造函数并开始使用非移动赋值运算符。

我正试图追查这一点,但由于缺乏我的传统工具而受到阻碍。两个问题立刻浮现在脑海:

  • 如何ld生成地图文件?这个链接器不起作用-map -Map -Wl,-map=foo -Wl,-Map=foo

    @(#)PROGRAM:ld  PROJECT:ld64-134.9
    configured to support archs: armv6 armv7 armv7s i386 x86_64
    LTO support using: LLVM version 3.1svn, from Apple Clang 4.1 (build 421.11.65)
    
  • 如何ld向我显示未解析的 C++ 符号的未分解名称,以便我可以轻松地 grep 映射/nm 文件?

当然,如果有人以前见过这个特定的错误并且知道如何修复它,我也会接受这些答案。:)

编辑:我意识到我上面写的关于移动构造函数的内容没有意义,因为在我写这个问题的过程中症状发生了变化。:P 每当我对发生的事情有了更好的了解时,我都会修复它。

编辑#2:错误消失了。我暂时责怪我们自建的 libc++:我最好的猜测是它没有任何符号(由于构建错误的拱门),我们真的很幸运,我们从未尝试使用任何非内联函数,除了这个。

不过,我关于-map和显示错误名称的问题仍然悬而未决。

4

2 回答 2

1

要让 clang 显示未解析符号列表的错位符号名称,请使用链接器/编译器标志:

-Xlinker --no-demangle
于 2015-06-22T08:59:18.100 回答
0

在 libc++<string>标头中,basic_string::operator=(const char*)声明/定义为:

_LIBCPP_INLINE_VISIBILITY basic_string& operator=(const_pointer __s) {return assign(__s);}

_LIBCPP_INLINE_VISIBILITY 是一个扩展为“始终内联”和“标记隐藏”的宏。因此,这个成员函数应该总是被内联的,并且链接器永远不应该寻找它。

您是否偶然更改了 _LIBCPP_INLINE_VISIBILITY 宏的定义?

于 2012-11-19T23:59:33.690 回答