2015-09-06 13 views
6

Tôi đang cố gắng sử dụng homebrew để tải xuống và xây dựng các gói như boost, ceres-solver, những thứ tương tự. Điều gì xảy ra tôi sẽ cố gắng và biên dịch mã, mà không cần bất kỳ cờ đặc biệt (g++ foo.cpp -o foo -I /usr/local/... và tôi đã cố gắng kêu vang ++ quá) và tôi nhận được lỗi này một cách nhất quán:ld: không tìm thấy ký hiệu cho kiến ​​trúc x86_64, clang: lệnh liên kết không thành công

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) 

Vì vậy, tôi nhìn quanh và giải pháp là sử dụng -stdlib=libstdc++ cờ. Tôi đã thử nó, và bây giờ nó mang lại cho tôi lỗi liên quan đến thực tế là táo tàu một phiên bản cũ của libstdc++, không được cố định bằng cách gọi -std=c++11 hoặc -std=c++14. Nó phản đối cú pháp C++ 11 giống như shared_ptr:

/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. 

Tôi không muốn chỉnh sửa mã nguồn thư viện nếu tôi không có, tôi hy vọng các nhà phát triển đã làm rất tốt việc làm?

Có cách nào để xây dựng thư viện (có hoặc không có homebrew) sẽ cung cấp liên kết chính xác không? Hiện tại tôi chỉ cần brew install <package> Tôi thiếu một số thứ hiển nhiên? Hoặc tôi đang vặn một cái gì đó lên khi tôi biên dịch mã chính nó?

Tôi đang trên Mac OS X 10.10.5, và brew --config cho này:

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 

Chạy $arch cho: i386

$clang++ -v cho:

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 

Tôi nên thêm rằng tôi đã cố gắng làm sạch máy tính của tôi trong trường hợp có một phiên bản cũ hoặc một cái gì đó mucking những thứ lên. Tất cả mọi thứ tôi đã nhìn thấy nói lỗi này là do liên kết không đúng lúc xây dựng thời gian, nhưng nó có vẻ như brew nào hầu hết trong số đó đúng, ít nhất là xa như tôi có thể nói? Mọi thứ đều cài đặt và xây dựng tốt.

Tôi đã cài đặt gcc bằng cách sử dụng bia và cố gắng biên dịch thư viện bằng cách sử dụng lệnh g ++ - 5 và gcc-5 để tránh tiếng kêu và tôi gặp vấn đề tương tự khi cố gắng chuyển cờ -std=c++11 vào thời gian biên dịch - g++-5 foo.cpp -o foo -I /usr/local/bar -std=c++11 . Không có công việc nào trong số này.

Tôi cũng nên nhấn mạnh rằng những điều này xảy ra khi tôi cố gắng biên dịch và chạy các tập lệnh mẫu đi kèm, ví dụ: tăng, thậm chí không phải là tập lệnh của riêng tôi. Tôi chỉ hy vọng rằng các thư viện ít nhất là chính xác.

Tôi cũng đã xem rất nhiều câu hỏi tương tự ở đây, nhiều câu hỏi chưa được trả lời và những câu hỏi có giải pháp, tốt, tôi đã thử nhiều giải pháp và chúng cũng không giúp ích gì. Tôi đã thử -lstdc++.6, tôi đã thử -stdlib=libstdc++. Các -l không thay đổi bất cứ điều gì, các -stdlib gây ra các vấn đề tôi mô tả ở trên.

Bất kỳ trợ giúp nào tôi có thể nhận được sẽ thật tuyệt vời, tôi đã làm việc này trong nhiều tuần và điều đó khiến tôi phát điên.

Sửa nhanh cho rõ ràng:

Vì vậy, khi tôi đầu vào:

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

hoặc

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

tôi nhận được:

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) 

Và đây không chỉ là ceres, các lỗi tương tự xảy ra để tăng als o.

+1

Sử dụng libC++ không libstdC++. Nếu bạn hiển thị thông báo biểu tượng thiếu thực tế thì sẽ dễ dàng hơn để xem những gì đang xảy ra nữa :) IIRC libstdC++ là phiên bản GNU cũ của thư viện. libC++ sẽ làm việc cho hầu hết mọi thứ ngay bây giờ. Và có thể hiển thị các bước chính xác để tạo ra sự cố? – JCx

+1

Nhập ở trên, cảm ơn :) Lý do duy nhất tôi sử dụng libstdC++ là bởi vì nó thực sự đã cho tôi một lỗi khác nhau, tôi nghĩ rằng nó có thể hữu ích cho việc tìm ra những gì sai. – bzcheeseman

+0

thử gõ 'which g ++' và 'clang ++'. có vẻ như đường dẫn của bạn bị rối tung lên và bạn không thực sự chạy các chương trình mà bạn nghĩ bạn đang làm. nếu bạn muốn chỉ định chính xác nhị phân nào để chạy, bạn có thể sử dụng cú pháp '. /' trong bash và chỉ định đường dẫn đầy đủ đến nhị phân –

Trả lời

7

Cảm ơn Mark Setchell:

Giữ một mắt trên /usr/local/lib là rất quan trọng khi sử dụng homebrew, các thư viện liên kết cần phải được xác định.

Mã thức mà làm việc là thế này:

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

Câu trả lời tương tự dường như làm việc cho các thư viện tăng, cũng như tất cả những người khác tôi đã cố gắng (Qt bao gồm, cho đến nay).

+1

Làm tốt để phân loại và chia sẻ với cộng đồng. Bạn có thể chấp nhận câu trả lời của riêng bạn và nhận điểm để làm như vậy. –

Các vấn đề liên quan