在OS X 10.8.2(Mountain Lion)上,我正在尝试使用libc ++(而不是libstdc ++)链接程序,而 < / p>
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)
这似乎是指以下行的codegen:
mystdstring = ::std::string(mycharpointer + myint);
如果我将其更改为
mystdstring = mycharpointer + myint;
然后一切正常,因为我们停止使用move-constructor并开始使用非移动赋值运算符。
我正试图追踪这一点,但由于缺乏传统工具,我受到了阻碍。立即想到两个问题:
如何让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 map / nm文件?
当然,如果有人之前已经看过这个特殊的错误并且知道如何修复它,我也会接受这些答案。 :)
我对-map
的问题以及显示错位名称的问题仍然存在。
答案 0 :(得分:1)
要让clang显示未解析符号列表的错位符号名称,请使用链接器/编译器标志:
-Xlinker --no-demangle
答案 1 :(得分: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宏的定义?