В 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;
тогда все работает нормально, потому что мы прекращаем использовать конструктор перемещения и начинаем использовать оператор присваивания без перемещения.
Я пытаюсь отследить это, но мне мешает отсутствие моих традиционных инструментов. На ум сразу приходят два вопроса:
Как я могу получить 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 ++, чтобы я мог легко получить файл map / nm?
И, конечно, если кто-то уже видел эту конкретную ошибку и знает, как ее исправить, я тоже приму эти ответы. 🙂
РЕДАКТИРОВАТЬ: я понимаю, что то, что я написал выше о конструкторах перемещения, не имеет смысла, потому что симптом изменился в середине моего написания этого вопроса. : P Я исправлю это всякий раз, когда получу лучшее представление о том, что происходит.
РЕДАКТИРОВАТЬ # 2: ошибка исчезла. Я осторожно виню нашу самодельную libc ++: я думаю, что она не имела любой символы в нем (из-за построения для неправильной арки), и нам просто повезло, что мы никогда не пытались использовать какие-либо не встроенные функции, кроме этой.
Мои вопросы о -map
и показ искалеченных имен все еще открыт, хотя.
Чтобы clang отображал искаженные имена символов для списка неразрешенных символов, используйте флаги компоновщика / компилятора:
-Xlinker --no-demangle
В 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?