2012-09-20 4 views
16

Bonjour J'essaye de lier avec boost pour utiliser la librairie de threads, mais je n'arrive pas à la construire.Lien avec Boost (Homebrew) Mac C++

J'ai installé boost avec HomeBrew (programme d'installation de mac) et il est dans le répertoire /usr/local/Cellar/boost/1.50.0.

Mon fichier principal est très simple en ce moment ...

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

Mon fichier makefile est comme ceci:

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 

Et quand je lance cela, je reçois une bibliothèque introuvable pour boost_system . Si je prends le boost_system, je reçois une erreur qui ressemble à ceci:

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

Pourquoi vous liez un fichier avec le suffixe '-mt' et un sans? Essayez '-lboost_thread -lboost_system' ou' -lboost_thread-mt -lboost_system-mt' –

+0

bonjour, quand je lie avec juste -lboost_thread cela me donne une erreur de ld 'ld: bibliothèque introuvable pour -lboost_thread collect2: ld retourné 1 exit status' – JonMorehouse

+1

Que se passe-t-il lorsque vous ajoutez '-mt' aux deux? –

Répondre

16

SI vous venez d'utiliser brew install boost sans option, cela construit un binaire 64 bits - à la fois statiques et dynamiques.

Votre principal coupable du code ci-dessus est l'utilisation de l'option -m32, enlevez ceci et vous devriez aller bien. Cela signifie que vous essayez de lier une version 32 bits à une bibliothèque 64 bits. Les bibliothèques Boost sont symboliquement liées aux binaires et en-têtes réels dans /usr/local/Cellar/ - (/usr/local/lib et /usr/local/include). Votre PATH devrait inclure ceux-ci, donc pas besoin de les spécifier dans votre makefile. Notez que brew (par extension gcc) génère généralement des binaires 64 bits par défaut, sur lesquels les bibliothèques Boost ont été construites à partir de votre sortie d'erreur. (Vous pouvez vérifier que l'architecture est une bibliothèque en utilisant ces outils otool, file ou lipo)

+4

Que se passe-t-il s'il * veut * construire en 32 bits? – inetknght

+0

Je suis désolé, j'ai quelques problèmes avec l'installation de boost. quand j'installe boost avec infusion, il ne crée pas de "lien symbolique" dans/usr/local/include, et si j'essaie d'inclure la librairie dans un projet XCode, il ne trouve pas la librairie, comment puis-je la réparer ? –

8

Comme indiqué par Jesse Bon vous avez un problème avec le suffixe -MT. Il semble que le suffixe -mt (pour le support multi-thread) ne soit pas utilisé dans les installations Linux boost, mais sur Mac et d'autres. Boost sur Linux est toujours supporté par plusieurs threads, c'est juste une convention de nommage. Voir aussi https://stackoverflow.com/a/2310892 pour cela. C'est pourquoi vous devez ajouter le suffixe -mt à toutes vos librairies boost dans les options de liens sur Mac et Windows, mais pas sur Linux. Si vous utilisez CMake avec Linux co-développeurs (comme moi), vous pouvez modifier CMakeLists.txt comme ceci:

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 fait, boost construit généralement les deux versions sur Mac OS X (une avec et une sans multithreading). Ce n'est pas ** juste ** une convention de nommage et vous pouvez explicitement désactiver la variante mono-thread dans 'homebrew' avec' --without-single'. Cependant, il n'y a pas de version unique pour 'boost_thread'. – Chris

Questions connexes