2012-09-20 25 views
16

Hola, estoy intentando vincular con boost para usar la biblioteca de threading, pero parece que no se puede construir.Enlace con Boost (Homebrew) Mac C++

Instalé boost con HomeBrew (instalador de mac package) y está en el directorio /usr/local/Cellar/boost/1.50.0.

Mi archivo principal es muy simple en este momento ...

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

Mi archivo make es así:

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 

Y cuando corro esto, tengo una biblioteca que no se encuentra para boost_system . Si saco la boost_system, entonces me sale un error que se ve así:

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

¿Por qué está la vinculación de un archivo con el sufijo '-mt' y otro sin él? Pruebe '-lboost_thread -lboost_system' o' -lboost_thread-mt -lboost_system-mt' –

+0

hola, cuando me enlace con solo -lboost_thread me da un error de ld 'ld: biblioteca no encontrada para -lboost_thread collect2: ld returned 1 estado de salida' – JonMorehouse

+1

¿Qué ocurre cuando agrega '-mt' a ambos? –

Respuesta

16

SI Si ha estado utilizando brew install boost sin opciones, esto construye un binario de 64 bits - tanto estática como dinámica.

Su principal culpable del código anterior es el uso de la opción -m32, elimínelo y debe estar bien. Esto significa que está intentando vincular una compilación de 32 bits con una biblioteca de 64 bits.

Las bibliotecas Boost están vinculados a los binarios reales y los encabezados en /usr/local/Cellar/ simbólica - (/usr/local/lib y /usr/local/include). Su RUTA debe incluir estos, por lo que no es necesario especificarlos en su archivo MAKE.

Tenga en cuenta que brew (por extensión gcc) generalmente construye binarios de 64 bits de forma predeterminada, que a partir de su salida de error las bibliotecas de Boost se han creado. (Se puede comprobar que la arquitectura es una biblioteca mediante el uso de estas herramientas otool, file o lipo)

+4

¿Qué pasa si él * does * quiere compilar para 32 bits? – inetknght

+0

Lo siento, tengo algunos problemas con la instalación de boost. cuando instalo boost con brew no crea ningún "enlace simbólico" en/usr/local/include, y si trato de incluir la biblioteca en un proyecto XCode, no encuentra la biblioteca, ¿cómo puedo solucionarlo? ? –

8

Como se indica por Jesse buenas que tiene un problema con el sufijo -mt. Para todos ejecutarse de nuevo en esto (incluso en Windows):

Resulta que el sufijo -mt (que significa soporte multi-hilo) no se usa en instalaciones de impulso de Linux, pero en Mac y otros. Boost en Linux todavía es compatible con múltiples subprocesos, es solo una convención de nomenclatura. Vea también https://stackoverflow.com/a/2310892 para esto.

Es por eso que tiene que agregar el sufijo -mt a todas sus bibliotecas de impulso en las opciones de enlace en Mac y Windows, pero no en Linux. Si está usando CMake con Linux co-desarrolladores (como yo) puede modificar CMakeLists.txt así:

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

En realidad, boost generalmente genera ambas versiones en Mac OS X (una con y otra sin multithreading). Esto no es ** solo ** una convención de nomenclatura y puede desactivar explícitamente la variante de subprocesamiento único en 'homebrew' con '--without-single'. Sin embargo, no aparece una única versión con subprocesos para 'boost_thread'. – Chris