在 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
和显示错误名称的问题仍然悬而未决。