2

リンク段階で問題に直面しています。

私は何をしようとしていますか?

チェッカーをclangに追加しようとしています。ソースコードから LLVM と libc++ をビルドしました (はい、ビルド後の libcxx テスト中にいくつかのテストが失敗しました)。libc++ ライブラリを特定するために、次のコードを Clang のルート ディレクトリ Makefile に追加しました。

CXX.Flags += -stdlib=libc++
CXX.Flags += -std=c++11
CXX.Flags += -nostdinc++
CXX.Flags += -I/path/to/my/own/c++library/libcxx/include
LD.Flags += -L/path/to/my/own/c++library/libcxx/lib

リンカーの問題は次のように表面化しました。

Undefined symbols for architecture x86_64:
"std::__1::__shared_weak_count::__get_deleter(std::type_info const&) const", referenced from:
      vtable for std::__1::__shared_ptr_p-traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::regex_traits<char>::__init() in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::ios_base::getloc() const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::__get_classname(char const*, bool)", referenced from:
      unsigned int std::__1::regex_traits<char>::__lookup_classname<char const*>(char const*, char const*, bool, char) const in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::__shared_weak_count::__add_shared()", referenced from:
      std::__1::basic_regex<char, std::__1::regex_traits<char> >::basic_regex(std::__1::basic_regex<char, std::__1::regex_traits<char> > const&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::__shared_weak_count::__release_shared()", referenced from:
      std::__1::shared_ptr<std::__1::__empty_state<char> >::~shared_ptr() in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::__shared_weak_count::~__shared_weak_count()", referenced from:
      std::__1::__shared_ptr_pointer<std::__1::__empty_state<char>*, std::__1::default_delete<std::__1::__empty_state<char> >, std::__1::allocator<std::__1::__empty_state<char> > >::~__shared_ptr_pointer() in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::__get_collation_name(char const*)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > std::__1::regex_traits<char>::__lookup_collatename<char const*>(char const*, char const*, char) const in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > std::__1::regex_traits<char>::__lookup_collatename<char*>(char*, char*, char) const in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::cout", referenced from:
      (anonymous namespace)::ObjCSelfInitChecker::checkPreStmt(clang::ObjCStringLiteral const*, clang::ento::CheckerContext&) const in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::ctype<char>::id", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::regex_traits<char>::__init() in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::locale::locale(std::__1::locale const&)", referenced from:
      std::__1::basic_regex<char, std::__1::regex_traits<char> >::__start_matching_list(bool) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::regex_traits<char>::regex_traits(std::__1::regex_traits<char> const&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::locale::locale()", referenced from:
      std::__1::regex_traits<char>::regex_traits() in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::locale::~locale()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::regex_traits<char>::~regex_traits() in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_regex<char, std::__1::regex_traits<char> >::__start_matching_list(bool) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::collate<char>::id", referenced from:
      std::__1::regex_traits<char>::__init() in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "std::__1::ios_base::clear(unsigned int)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >::put(char) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush() in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry() in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  "vtable for std::__1::__shared_count", referenced from:
      std::__1::shared_ptr<std::__1::__empty_state<char> >::shared_ptr<std::__1::__empty_state<char>, void>(std::__1::__empty_state<char>*) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for std::__1::__shared_weak_count", referenced from:
      std::__1::shared_ptr<std::__1::__empty_state<char> >::shared_ptr<std::__1::__empty_state<char>, void>(std::__1::__empty_state<char>*) in libclangStaticAnalyzerCheckers.a(ObjCSelfInitChecker.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [/Users/msecurity/Documents/Deepak/Eclipse/clang_build/build/Debug+Asserts/bin/clang] Error 1
make[1]: *** [driver/.makeall] Error 2
make: *** [all] Error 1

-v オプションを使用してリンカーの呼び出しを確認するというリンカーの提案に従い、次の出力を得ました。

"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o /path/to/onw/clang/build/Debug+Asserts/bin/clang -L/path/to/onw/clang//build/Debug+Asserts/lib -L/path/to/onw/clang/build/Debug+Asserts/lib -L/path/to/libc++/build/libcxx/lib -rpath @executable_path/../lib -sectcreate __TEXT __info_plist /path/to/onw/clang/build/tools/clang/tools/driver/Debug+Asserts/Info.plist /path/to/onw/clang/build/tools/clang/tools/driver/Debug+Asserts/cc1_main.o /path/to/onw/clang/build/tools/clang/tools/driver/Debug+Asserts/cc1as_main.o /path/to/onw/clang/build/tools/clang/tools/driver/Debug+Asserts/driver.o -lclangFrontendTool -lclangFrontend -lclangDriver -lclangSerialization -lclangCodeGen -lclangParse -lclangSema -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers -lclangStaticAnalyzerCore -lclangARCMigrate -lclangRewriteFrontend -lclangRewriteCore -lclangAnalysis -lclangEdit -lclangAST -lclangBasic -lclangLex -lLLVMOption -lLLVMLinker -lLLVMIRReader -lLLVMipo -lLLVMVectorize -lLLVMInstrumentation -lLLVMBitWriter -lLLVMBitReader -lLLVMAsmParser -lLLVMR600CodeGen -lLLVMR600Desc -lLLVMR600Info -lLLVMR600AsmPrinter -lLLVMSystemZDisassembler -lLLVMSystemZCodeGen -lLLVMSystemZAsmParser -lLLVMSystemZDesc -lLLVMSystemZInfo -lLLVMSystemZAsmPrinter -lLLVMHexagonCodeGen -lLLVMHexagonAsmPrinter -lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc -lLLVMNVPTXInfo -lLLVMNVPTXAsmPrinter -lLLVMCppBackendCodeGen -lLLVMCppBackendInfo -lLLVMMSP430CodeGen -lLLVMMSP430Desc -lLLVMMSP430Info -lLLVMMSP430AsmPrinter -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen -lLLVMXCoreDesc -lLLVMXCoreInfo -lLLVMXCoreAsmPrinter -lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMPowerPCCodeGen -lLLVMPowerPCAsmParser -lLLVMPowerPCDesc -lLLVMPowerPCInfo -lLLVMPowerPCAsmPrinter -lLLVMSparcCodeGen -lLLVMSparcDesc -lLLVMSparcInfo -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMMCParser -lLLVMCodeGen -lLLVMObjCARCOpts -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMX86Desc -lLLVMX86Info -lLLVMTarget -lLLVMX86AsmPrinter -lLLVMMC -lLLVMObject -lLLVMX86Utils -lLLVMCore -lLLVMSupport -lz -lpthread -lcurses -lm -lstdc++ -lSystem /usr/bin/../lib/clang/4.2/lib/darwin/libclang_rt.osx.a

上記の呼び出しでldの6番目のオプションであるため、私が構築したC++ 11ライブラリを使用していることに気付きました。私が世話をする必要がある他のオプションはありますか?

解決策が利用可能かどうかグーグルで調べてみたところ、非インライン仮想関数の vtable エントリが欠落しているというこの種の問題が以前のバージョンの llvm に存在し、最新バージョンを使用すると他の人に役立ちました。しかし、私はすでにllvmの最新バージョンを使用しています。以下はclang -vの出力です

clang バージョン 3.4 (トランク 192102) (llvm/トランク 192100)
ターゲット: x86_64-apple-darwin12.3.0
スレッドモデル: posix

問題を解決する可能な方法を教えてください。詳細を共有する必要がある場合はお知らせください。私が何らかの慣習や規範に違反している場合 (これは StackOverflow に関する私の最初の質問です)、申し訳ありませんが、親切にお知らせください。

注意してください:以前にチェッカーを追加しましたが、正常に機能しており、目的を果たしていました。上記の問題はすべて、同じチェッカーを拡張するために標準 C++ ヘッダー <regex> をインクルードしようとしたときに発生しました。

4

2 に答える 2

2

リンカー コマンドラインでわかるように、libstdc++ (-lstdc++) を使用してリンクしようとしています。したがって、libc++ でコンパイルされたオブジェクトと libstdc++ を混在させています。

于 2013-10-23T09:36:31.310 に答える
1

問題が解決しました。次の構成オプションを使用して LLVM をコンパイルすると、問題を解決するのに役立ちました。

../llvm/configure \ CXXFLAGS="-stdlib=libc++ -std=c++11" \ OBJCXXFLAGS="-stdlib=libc++ -std=c++11" \ LDFLAGS="-stdlib=libc++"

いつか誰かの役に立ちますように。皆さん、ありがとうございました。

于 2013-10-24T09:20:48.777 に答える