2012-06-18 37 views
8

Tôi gặp sự cố khi vượt qua giai đoạn liên kết trong chương trình C++ của mình do các vấn đề với Boost 1.49. Tôi đã chuyển sang C++ (-std=c++11 -libc=libc++) hoạt động tốt cho một đoạn mã khác (cũng sử dụng tăng cường). Boost được cài đặt bằng homebrew với:Liên kết các vấn đề với boost :: program_options trên OSX sử dụng LLVM

brew install boost --universal --with-mpi --with-icu 

Sự cố bắt đầu với boost::program_options. Tôi nhận được các lỗi liên kết như thế này:

"boost::program_options::validate(boost::any&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, int)", referenced from: 

... etc. ... 

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

Đây là một chút kỳ lạ, bởi vì làm một nm trên thư viện sử dụng cho thấy, đó là biểu tượng dường như có mặt ở đó:

nm -U /usr/local/lib/libboost_program_options-mt.dylib | grep validate 
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 đã cố gắng coaxing homebrew để biên dịch boost với clang thay vì gcc bằng cách thiết lập CXX và CXX_FLAGS cho phù hợp trước khi cài đặt. Không chắc tôi đã thành công.

Con trỏ được đánh giá cao.

+0

Câu hỏi tương tự như: http://stackoverflow.com/questions/8454329/why-cant-clang-with-libc-in-c0x-mode-link-this-boostprogram-options-examp –

Trả lời

8

Bạn sẽ cần phải biên dịch lại tăng với cờ và cờ std11, thư viện libC++ không tương thích nhị phân với libstdC++ đã cài đặt trong OSX (phiên bản gcc trước khi thay đổi thành gpl3). Nếu phiên bản clang của bạn là 3.1 hoặc hơn thì bạn có thể sử dụng (nếu không thay đổi C++ 11 thành C++ 0x cho các phiên bản cũ hơn).

./bootstrap.sh 
mkdir build 
sudo ./bjam toolset=clang cxxflags="-std=c++0x -stdlib=libc++" variant=release link=static threading=multi runtime-link=shared --build-dir=Build --layout=system --without-mpi --without-python install --prefix=/usr/local 

Bạn có thể dĩ nhiên thay đổi bất kỳ trong số này như bạn muốn trừ

CXXFLAGS công cụ = vang = "- std = C++ 0x -stdlib = libC++"

này nên làm việc cho bạn.

+0

Xin chào, cảm ơn vì con trỏ. Nghĩ càng nhiều. Tuy nhiên, tôi không thể có được Boost để biên dịch các thư viện động cho tôi bây giờ. Tôi đã thử điều này: 'sudo ./bjam toolset = clang cxxflags = "- std = C++ 11 -stdlib = libC++" biến = liên kết phát hành = chia sẻ luồng = multi runtime-link = shared --build-dir = Xây dựng --layout = system --không có mpi - cài đặt không có python --prefix =/usr/local ' nhưng chỉ có các giá trị tĩnh. –

+1

Cuối cùng tôi đã nhận được câu trả lời thông qua Boost.Build-Forum: http://boost.2283326.n4.nabble.com/Problems-building-Boost-with-clang-toolchain-and-C-11-td4631556.html Tóm lại: Tôi đã bỏ lỡ 'linkflags' khi gọi bjam: ./b2 toolset = clang cxxflags = "- std = C++ 11 -stdlib = libC++" linkflags = "- stdlib = libC++" –

3

Tôi muốn chia sẻ (vừa đau đớn) của tôi kinh nghiệm xây dựng Boost 1,54 trên Mac OS X 10.8.5 với kêu vang 5.0.0 như được cung cấp bởi Xcode 5.0. Nếu bạn muốn các tính năng C++ 11 nó là rất quan trọng để biên dịch và liên kết với clang++, không phải với clang.

Minh họa: uống theo chương trình đơn giản sau đây:

#include <iostream> 
#include <string> 

int main(int argc, char *argv[]) { 
    std::string str = "OK"; 
    std::cout << str << std::endl; 
    return 0; 
} 

có thể được xây dựng với lệnh sau đây:

clang++ -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr

Tuy nhiên, nếu bạn cố gắng này để thay thế:

clang -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr

sau đó bạn nhận được lỗi liên kết. Lưu ý rằng clang manpage nói rằng ngôn ngữ được chọn theo tùy chọn -std=, nhưng điều này rõ ràng là không đủ.

Bài học là chúng tôi phải thông báo bjam để sử dụng rõ ràng clang++ khi biên dịch Boost với hỗ trợ C++ 11.

Sau this very useful post, tôi đặt sau đây vào tôi tools/build/v2/user-config.jam:

using clang : 11 
    : "/usr/bin/clang++" 
    : <cxxflags>"-std=c++11 -stdlib=libc++ -ftemplate-depth=512" <linkflags>"-stdlib=libc++" 
    ; 

Sau đó, tôi chạy ./b2 clean, sau đó tôi đã xây dựng Boost với lệnh sau đây:

mkdir -p build/clangstage/ 
./b2 -j8 --build-dir=build --stagedir=build/clangstage toolset=clang-11 define=BOOST_SYSTEM_NO_DEPRECATED variant=release threading=multi address-model=64 stage 

này được xây dựng 64-bit tĩnh và thư viện động với hỗ trợ đa luồng. Nếu bạn cần một tập hợp khác thì hãy thay đổi lệnh trên cho phù hợp.

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