2012-09-20 9 views
16

Xin chào, tôi đang cố gắng liên kết với việc tăng cường sử dụng thư viện luồng, nhưng dường như không thể làm cho nó được xây dựng.Liên kết với Boost (Homebrew) Mac C++

Tôi đã cài đặt tăng với HomeBrew (trình cài đặt gói mac) và nó nằm trong thư mục /usr/local/Cellar/boost/1.50.0.

tập tin chính của tôi là rất đơn giản ngay bây giờ ...

#include <iostream> 
#include <boost/thread.hpp> 

làm cho tập tin của tôi là như thế này:

CC = g++ 


BASE_FLAGS = -m32 -wAll 

# INCLUDE BASE DIRECTORY AND BOOST DIRECTORY FOR HEADERS 
LDFLAGS = -I/usr/local/Cellar/boost/1.50.0/include -I/opt/local/include 

# INCLUDE BASE DIRECTORY AND BOOST DIRECTORY FOR LIB FILES 
LLIBFLAGS = -L/usr/local/Cellar/boost/1.50.0/ 

# SPECIFIY LINK OPTIONS 
LINKFLAGS = -l boost_thread-mt -lboost_system 

# FINAL FLAGS -- TO BE USED THROUGHOUT 
FLAGS = $(BASE_FLAGS) $(LLIBFLAGS) $(LDFLAGS) $(LINKFLAGS) 




# NOTE FOR BOOST -- YOU ONLY NEED TO INCLUDE THE PATH BECAUSE IT ONLY INSTALLS HEADER FILES 
main: main.cpp 
    $(CC) $(FLAGS) -o main.out main.cpp 

Và khi tôi chạy này, tôi nhận được một thư viện không tìm thấy cho boost_system . Nếu tôi đưa ra các boost_system, sau đó tôi nhận được một lỗi mà trông như thế này:

ld: warning: ignoring file /usr/local/lib/libboost_thread-mt.dylib, file was built for unsupported file format (0xcf 0xfa 0xed 0xfe 0x 7 0x 0 0x 0 0x 1 0x 3 0x 0 0x 0 0x 0 0x 6 0x 0 0x 0 0x 0) which is not the architecture being linked (i386): /usr/local/lib/libboost_thread-mt.dylib 
Undefined symbols for architecture i386: 
    "boost::system::system_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in ccKwJWzr.o 
    "boost::system::generic_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in ccKwJWzr.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
make: *** [main] Error 1 
+0

Tại sao bạn kết nối một tập tin với 'suffix -mt' và một không? Hãy thử '-lboost_thread -lboost_system' hoặc' -lboost_thread-mt -lboost_system-mt' –

+0

hello, khi tôi liên kết với chỉ -lboost_thread nó cho tôi một lỗi của ld 'ld: thư viện không tìm thấy cho -lboost_thread collect2: ld trả về 1 exit status' – JonMorehouse

+1

Điều gì sẽ xảy ra khi bạn thêm '-mt' vào cả hai? –

Trả lời

16

NẾU bạn vừa sử dụng brew install boost không có tùy chọn, điều này xây dựng một phiên bản 64-bit nhị phân - cả tĩnh và động.

Thủ phạm chính của bạn từ mã ở trên là sử dụng tùy chọn -m32, xóa tùy chọn này và bạn sẽ không sao. Điều này có nghĩa là bạn đang cố gắng liên kết một bản dựng 32 bit với thư viện 64 bit.

Thư viện tăng cường được liên kết tượng trưng với các tệp nhị phân và tiêu đề thực tế trong /usr/local/Cellar/ - (/usr/local/lib/usr/local/include). PATH của bạn nên bao gồm những điều này, vì vậy không cần phải chỉ định chúng trong makefile của bạn.

Lưu ý rằng brew (theo gcc mở rộng) thường xây dựng các tệp nhị phân 64 bit theo mặc định, từ đầu ra lỗi của bạn, thư viện Boost đã được xây dựng. (Bạn có thể kiểm tra kiến ​​trúc thư viện là bằng cách sử dụng những công cụ này otool, file hoặc lipo)

+4

Nếu anh ấy * muốn * muốn xây dựng cho 32-bit thì sao? – inetknght

+0

Tôi xin lỗi, tôi đang gặp một số vấn đề với việc cài đặt tăng cường. khi tôi cài đặt boost với brew nó không tạo ra bất kỳ "symbolic link" nào trong/usr/local/include, và nếu tôi cố gắng đưa thư viện vào trong một dự án XCode thì nó không tìm thấy thư viện, làm sao tôi có thể sửa nó ? –

8

Như đã nêu bởi Jesse Tốt bạn gặp rắc rối với các hậu tố-MT. Đối với tất cả chạy lại vào trong này (ngay cả trên Windows):

Nó chỉ ra rằng hậu tố -mt (đứng hỗ trợ đa luồng) không được sử dụng trong cài đặt tăng cường Linux, nhưng trên Mac và các thiết bị khác. Boost trên Linux vẫn hỗ trợ đa luồng, nó chỉ là một quy ước đặt tên. Xem thêm https://stackoverflow.com/a/2310892 cho việc này.

Đó là lý do tại sao bạn phải thêm hậu tố -mt vào tất cả các lib tăng cường của bạn trong các tùy chọn liên kết trên Mac và Windows, nhưng không phải trên Linux. Nếu bạn đang sử dụng CMake với Linux đồng các nhà phát triển (như tôi), bạn có thể sửa đổi CMakeLists.txt như thế này:

if(APPLE OR WIN32) 
    target_link_libraries([other libs..] boost_thread-mt boost_system-mt) 
else() 
    target_link_libraries([other libs..] boost_thread boost_system) 
endif() 
+0

Trên thực tế, tăng nói chung xây dựng cả hai phiên bản trên Mac OS X (một với và một mà không có đa luồng). Đây không chỉ là ** quy ước đặt tên và bạn có thể vô hiệu hóa một cách rõ ràng biến thể đơn luồng trong 'homebrew' bằng' --without-single'. Tuy nhiên, không có phiên bản ren đơn cho 'boost_thread' xuất hiện. – Chris