web-dev-qa-db-ja.com

ld:アーキテクチャx86_64のシンボルが見つかりません、clang:リンカーコマンドが失敗しました

私は自作を使用して、boost、ceres-solverなどのパッケージをダウンロードしてビルドしようとしています。何が起こるかというと、特別なフラグなしでコードをコンパイルしようとすると(g++ foo.cpp -o foo -I /usr/local/...そしてclang ++も試しました)、このエラーが一貫して発生します。

Undefined symbols for architecture x86_64:
  ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

それで私は周りを見回しました、そして解決策は-stdlib=libstdc++フラグを使うことです。試してみましたが、Appleは古いバージョンのlibstdc++を出荷し、-std=c++11を呼び出しても修正されない]という事実に関連するエラーが表示されます。 -std=c++14。shared_ptrのようなC++ 11構文に異議を唱えます。

/usr/local/include/ceres/internal/port.h:62:12: error: no member named
      'shared_ptr' in namespace 'std'
using std::shared_ptr;
      ~~~~~^
...
/usr/local/include/ceres/solver.h:629:15: error: expected member name or ';'
      after declaration specifiers
    shared_ptr<ParameterBlockOrdering> inner_iteration_ordering;
    ~~~~~~~~~~^
5 errors generated.

必要がなければ、ライブラリのソースコードを編集したくないのですが、開発者がかなり良い仕事をしたことを願っていますか?

正しいリンクを提供するライブラリ(自作の有無にかかわらず)を構築する方法はありますか?現在、私はbrew install <package>だけですが、明らかな何かが欠けていますか?それとも、コード自体をコンパイルするときに何かを台無しにしていますか?

私はMac OS X 10.10.5を使用しており、brew --configで次のようになります。

HOMEBREW_VERSION: 0.9.5
Origin: https://github.com/Homebrew/homebrew
HEAD: 03ad27453de01adc29cbf941bd29a2dfb54a9960
Last commit: 69 minutes ago
HOMEBREW_PREFIX: /usr/local
HOMEBREW_REPOSITORY: /usr/local
HOMEBREW_CELLAR: /usr/local/Cellar
HOMEBREW_BOTTLE_DOMAIN: https://homebrew.bintray.com
CPU: 8-core 64-bit ivybridge
OS X: 10.10.5-x86_64
Xcode: 6.4
CLT: 6.4.0.0.1.1435007323
Clang: 6.1 build 602
X11: N/A
System Ruby: 2.0.0-p481
Perl: /usr/bin/Perl
Python: /usr/local/bin/python => /Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
Ruby: /usr/bin/Ruby
Java: N/A

$Archを実行すると、次のようになります:i386

そして$clang++ -vは以下を与えます:

Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-Apple-darwin14.5.0
Thread model: posix

古いバージョンや何かがおかしくなった場合に備えて、コンピューターをクリーンアップしてみたことを付け加えておきます。私が見たすべてのことは、このエラーはビルド時の不適切なリンクが原因であると言っていますが、少なくとも私が知る限り、brewはそのほとんどを適切に行っているようです?すべてが正常にインストールおよび構築されます。

Brewを使用してgccをインストールし、g ++-5とgcc-5コマンドを使用してライブラリをコンパイルしてclangを回避しようとしましたが、コンパイル時に-std=c++11フラグを渡そうとすると同じ問題が発生します-g++-5 foo.cpp -o foo -I /usr/local/bar -std=c++11。これらはどれも機能しません。

また、これらは、たとえば、自分のスクリプトではなく、boostに付属するサンプルスクリプトをコンパイルして実行しようとしたときに発生することを強調する必要があります。私は、ライブラリが少なくともほとんど正しいことを望んでいます。

私はここでも多くの同様の質問を見てきましたが、多くは答えられておらず、解決策があるものもあります。私は多くの解決策を試しましたが、どちらも役に立ちません。 -lstdc++.6を試しましたが、-stdlib=libstdc++を試しました。 -lは何も変更せず、-stdlibは上記で説明した問題を引き起こします。

私が得ることができるどんな助けも素晴らしいだろう、私は今何週間もこれに取り組んできました、そしてそれは私を狂わせます。

わかりやすくするためのクイック編集:

だから私が入力すると:

$g++ cerestest.cpp -o ceres -I /usr/local/include/eigen3

または

$clang++ cerestest.cpp -o ceres -I /usr/local/include/eigen3

私は得る:

Undefined symbols for architecture x86_64:
  "ceres::Solve(ceres::Solver::Options const&, ceres::Problem*, ceres::Solver::Summary*)", referenced from:
      _main in cerestest-ef733e.o
  "ceres::Solver::Summary::Summary()", referenced from:
      _main in cerestest-ef733e.o
  "ceres::Problem::AddResidualBlock(ceres::CostFunction*, ceres::LossFunction*, double*)", referenced from:
      _main in cerestest-ef733e.o
  "ceres::Problem::Problem()", referenced from:
      _main in cerestest-ef733e.o
  "ceres::Problem::~Problem()", referenced from:
      _main in cerestest-ef733e.o
  "google::LogMessage::stream()", referenced from:
      ceres::AutoDiffCostFunction<CostFunctor, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0>::AutoDiffCostFunction(CostFunctor*) in cerestest-ef733e.o
      ceres::internal::AutoDiff<CostFunctor, double, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0>::Differentiate(CostFunctor const&, double const* const*, int, double*, double**) in cerestest-ef733e.o
      void ceres::internal::Make1stOrderPerturbation<ceres::Jet<double, 1>, double, 1>(int, double const*, ceres::Jet<double, 1>*) in cerestest-ef733e.o
      void ceres::internal::Take0thOrderPart<ceres::Jet<double, 1>, double*>(int, ceres::Jet<double, 1> const*, double*) in cerestest-ef733e.o
      void ceres::internal::Take1stOrderPart<ceres::Jet<double, 1>, double, 0, 1>(int, ceres::Jet<double, 1> const*, double*) in cerestest-ef733e.o
  "google::LogMessageFatal::LogMessageFatal(char const*, int)", referenced from:
      void ceres::internal::Make1stOrderPerturbation<ceres::Jet<double, 1>, double, 1>(int, double const*, ceres::Jet<double, 1>*) in cerestest-ef733e.o
      void ceres::internal::Take0thOrderPart<ceres::Jet<double, 1>, double*>(int, ceres::Jet<double, 1> const*, double*) in cerestest-ef733e.o
      void ceres::internal::Take1stOrderPart<ceres::Jet<double, 1>, double, 0, 1>(int, ceres::Jet<double, 1> const*, double*) in cerestest-ef733e.o
  "google::LogMessageFatal::LogMessageFatal(char const*, int, google::CheckOpString const&)", referenced from:
      ceres::AutoDiffCostFunction<CostFunctor, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0>::AutoDiffCostFunction(CostFunctor*) in cerestest-ef733e.o
      ceres::internal::AutoDiff<CostFunctor, double, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0>::Differentiate(CostFunctor const&, double const* const*, int, double*, double**) in cerestest-ef733e.o
  "google::LogMessageFatal::~LogMessageFatal()", referenced from:
      ceres::AutoDiffCostFunction<CostFunctor, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0>::AutoDiffCostFunction(CostFunctor*) in cerestest-ef733e.o
      ceres::internal::AutoDiff<CostFunctor, double, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0>::Differentiate(CostFunctor const&, double const* const*, int, double*, double**) in cerestest-ef733e.o
      void ceres::internal::Make1stOrderPerturbation<ceres::Jet<double, 1>, double, 1>(int, double const*, ceres::Jet<double, 1>*) in cerestest-ef733e.o
      void ceres::internal::Take0thOrderPart<ceres::Jet<double, 1>, double*>(int, ceres::Jet<double, 1> const*, double*) in cerestest-ef733e.o
      void ceres::internal::Take1stOrderPart<ceres::Jet<double, 1>, double, 0, 1>(int, ceres::Jet<double, 1> const*, double*) in cerestest-ef733e.o
  "google::InitGoogleLogging(char const*)", referenced from:
      _main in cerestest-ef733e.o
  "google::base::CheckOpMessageBuilder::ForVar2()", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in cerestest-ef733e.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >* google::MakeCheckOpString<int, ceres::DimensionType>(int const&, ceres::DimensionType const&, char const*) in cerestest-ef733e.o
  "google::base::CheckOpMessageBuilder::NewString()", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in cerestest-ef733e.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >* google::MakeCheckOpString<int, ceres::DimensionType>(int const&, ceres::DimensionType const&, char const*) in cerestest-ef733e.o
  "google::base::CheckOpMessageBuilder::CheckOpMessageBuilder(char const*)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in cerestest-ef733e.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >* google::MakeCheckOpString<int, ceres::DimensionType>(int const&, ceres::DimensionType const&, char const*) in cerestest-ef733e.o
  "google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder()", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in cerestest-ef733e.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >* google::MakeCheckOpString<int, ceres::DimensionType>(int const&, ceres::DimensionType const&, char const*) in cerestest-ef733e.o
  "ceres::Solver::Summary::BriefReport() const", referenced from:
      _main in cerestest-ef733e.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

そして、これは単なるセレスではなく、ブーストでも同様のエラーが発生します。

8
bzcheeseman

Mark Setchellに感謝します。

自作を使用する場合、/usr/local/libを監視することが重要であり、リンクライブラリを指定する必要があります。

動作した最終的なコードは次のとおりです。

g++ cerestest.cpp -o ceres -lglog -lceres -I /usr/local/include

同じ答えがboostライブラリや、私が試した他のすべてのライブラリ(Qtを含む)でも機能するようです。

8
bzcheeseman