簡體   English   中英

鏈接Boost(Homebrew)Mac c ++

[英]Link with Boost (Homebrew) Mac c++

您好我正在嘗試與boost鏈接以使用線程庫,但似乎無法將其構建。

我使用HomeBrew(mac包安裝程序)安裝了boost,它位於/usr/local/Cellar/boost/1.50.0目錄中。

我的主文件現在很簡單......

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

我的make文件是這樣的:

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

當我運行這個時,我找到了一個找不到boost_system的庫。 如果我取出boost_system,那么我得到一個如下所示的錯誤:

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

如果您剛剛使用brew install boost而沒有選項,則會構建一個64位二進制文​​件 - 靜態和動態。

你上面的代碼的主要罪魁禍首是使用-m32選項,刪除它,你應該沒問題。 這意味着您嘗試將32位版本與64位庫鏈接。

Boost庫與/usr/local/Cellar/ - ( /usr/local/lib/usr/local/include )中的實際二進制文件和標頭符號鏈接。 您的PATH應包含這些,因此無需在makefile中指定這些。

請注意,brew(通過擴展名為gcc)通常默認構建64位二進制文​​件,從錯誤輸出中構建了Boost庫。 (您可以使用這些工具otoolfilelipo來檢查庫的架構)

如Jesse Good所示,您遇到-mt后綴問題。 對於所有再次運行(甚至在Windows上):

事實證明,在Linux升級安裝中不使用-mt后綴(代表多線程支持),而是在Mac和其他設備上使用。 Linux上的Boost仍然支持多線程,它只是一個命名約定。 另請參閱https://stackoverflow.com/a/2310892

這就是為什么你必須在Mac和Windows上的鏈接選項中為所有升級庫添加-mt后綴,而不是在Linux上。 如果您使用CMake與Linux共同開發人員(就像我一樣),您可以像這樣修改CMakeLists.txt:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM