Do sự cố với Boost 1.49, tôi không thể vượt qua giai đoạn liên kết của chương trình C++ của mình. Tôi đã chuyển sang C++ (-std=c++11 -libc=libc++
) và nó hoạt động với một đoạn mã khác (cũng sử dụng boost). Boost được cài đặt bằng homebrew:
tăng cường cài đặt bia --universal --with-mpi --with-icu
rắc rối bắt đầu boost::program_options
. Tôi gặp lỗi liên kết như thế này:
"boost::program_options::validate(boost::any&, std::__1::vector<>, std::__1::allocator >, std::__1::allocator<>, std::__1::allocator > > > const&, std::__1::basic_string, std:: __1::allocator >*, int)", được tham chiếu từ:
... vân vân. ...
ld: không tìm thấy (các) ký hiệu cho kiến trúc x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Điều này hơi lạ, vì khi thực thi nm show trên thư viện được sử dụng, các ký hiệu dường như vẫn ở đó:
nm -U /usr/local/lib/libboost_program_options-mt.dylib grep xác thực
0000000000019880 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi
0000000000019880 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi
00000000000199e0 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi
00000000000199e0 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi
0000000000019930 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi
0000000000019930 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi
0000000000019c70 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPbi
0000000000019c70 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPbi
Tôi đã thử thuyết phục homebrew sử dụng clang thay vì gcc để biên dịch tăng cường bằng cách đặt CXX và CXX_FLAGS tương ứng trước khi cài đặt. Tôi không chắc liệu mình có thành công hay không.
Bất kỳ trợ giúp được đánh giá rất cao.
Bạn sẽ cần biên dịch lại boost bằng cờ clang và std11, thư viện libc++ không tương thích nhị phân với libstdc++ được cài đặt trong OSX (phiên bản cũ hơn của gcc trước khi đổi sang gpl3). Nếu phiên bản clang của bạn là 3.1 trở lên thì bạn có thể sử dụng (nếu không hãy thay đổi c++11 thành c++0x để có phiên bản cũ hơn).
./bootstrap.sh
xây dựng mkdir
sudo ./bjam toolset=clang cxxflags="-std=c++0x -stdlib=libc++"variant=release link=static threading=multi run-link=shared --build-dir=Build --layout=system -- không cómpi --không có-python cài đặt --prefix=/usr/local
Tất nhiên bạn có thể thay đổi bất cứ điều gì trong đó nếu bạn muốn, ngoại trừ
toolset=clang cxxflags="-std=c++0x -stdlib=libc++"
Điều này sẽ làm việc cho bạn.
Tôi là một lập trình viên xuất sắc, rất giỏi!