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)

これは、次の行の codegen を参照しているようです。

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

これを次のように変更すると

mystdstring = mycharpointer + myint;

ムーブコンストラクターの使用をやめ、非ムーブ代入演算子の使用を開始するため、すべてが正常に機能します。

私はこれを追跡しようとしていますが、従来のツールがないために妨げられています. 2 つの質問がすぐに思い浮かびます。

  • 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)
    
  • ldmap/nm ファイルを簡単に grep できるように、未解決の C++ シンボルのデマングルされていない名前を表示するにはどうすればよいですか?

もちろん、この特定のエラーを以前に見たことがあり、その修正方法を知っている人がいれば、それらの回答も受け入れます。:)

編集:この質問を書いている途中で症状が変わったため、ムーブコンストラクターについて上で書いたことは意味がないことに気づきました。:P 何が起こっているのかをよりよく理解するたびに修正します。

編集 #2: バグが消えました。私は暫定的に、自己ビルドした libc++ を非難しています: 私の最善の推測では、(間違ったアーキテクチャ用にビルドしたため) シンボルが含まれていなかったということです。これを除くインライン関数。

ただし、マングルされた名前とその表示に関する私の質問-mapはまだ未解決です。

4

2 に答える 2

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 に答える