Hola estoy tratando de enlace con el impulso a utilizar el roscado de la biblioteca, pero parece que no puede conseguir es construido.

He instalado impulso con el HomeBrew (mac instalador de paquetes) y es en el /usr/local/Cellar/boost/1.50.0 directorio.

Mi archivo principal es muy simple ahora…

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

Mi archivo es este:

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 ejecuto esto, tengo una biblioteca no se encuentra en boost_system. Si me saco la boost_system, luego me sale un error similar a este:

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
  • ¿Por qué te vincular un archivo con -mt sufijo y un sin? Trate de -lboost_thread -lboost_system o -lboost_thread-mt -lboost_system-mt
  • hola, cuando me conecte con lboost_thread me da un error de ld ld: library not found for -lboost_thread collect2: ld returned 1 exit status
  • ¿Qué sucede cuando se agrega -mt a ambos?
  • Hey, que compila perfectamente! — ¿Qué mt significa?
  • Es una cosa rara cuando MT NO significa multi-roscado en esta profesión. Esta no es la excepción a la regla.
  • mt multi-threading. Esto significa que la biblioteca tiene multi-threaded habilitada la compatibilidad. Dónde tratando de vincular multi-hilo habilitada la compatibilidad de la biblioteca con una biblioteca de sin multi-threaded habilitada la compatibilidad (la ausencia de mt significa que no habilitado). Asegúrese de que el enlace de las bibliotecas con los mismos sufijos.
  • Gracias por el aporte. Como usted puede decir, soy nuevo en el multi-threaded. Gracias de nuevo
  • No debería ser -Wall en lugar de la wAll stackoverflow.com/a/31705395/1655567 ?

InformationsquelleAutor JonMorehouse | 2012-09-20

2 Comentarios

  1. 17

    SI acaba de utilizar brew install boost con ninguna de las opciones, de esta forma se genera un binario de 64 bits – estáticos y dinámicos.

    Su principal culpable de que el código anterior es el uso de -m32 opción, quitar esto y usted debe estar bien. Esto significa que usted está tratando de enlace de 32 bits construir en contra de una de 64 bits de la biblioteca.

    El Impulso de las bibliotecas son simbólicos vinculados a la binarios reales y los encabezados en /usr/local/Cellar/ – (/usr/local/lib y /usr/local/include). Su RUTA de acceso debe incluir estos, así que no hay necesidad de especificar estas en el fichero makefile.

    Nota que la cerveza (por extensión gcc) generalmente se basa archivos binarios de 64 bits de forma predeterminada, que desde su salida de error el Impulso de las bibliotecas se han construido en. (usted puede comprobar que la arquitectura de una biblioteca es mediante el uso de estas herramientas otool, file o lipo)

    • ¿Y si él no quiero construir para 32 bits?
    • Lo siento, estoy teniendo algunos problemas con la instalación de boost. cuando instalo el impulso con el brebaje no crear cualquier «enlace simbólico» en el directorio /usr/local/include, y si trato de incluir en la biblioteca de un proyecto de XCode no encuentra la biblioteca, ¿cómo puedo solucionarlo?
  2. 11

    Como se indica por Jesse Bien tienes un problema con el -mt sufijo. Para todos a correr de nuevo en esto (incluso en Windows):

    Resulta que la mt sufijo (de pie para multi-hilo de apoyo) no se usa en Linux impulso de las instalaciones, pero en Mac y otros. Impulsar en Linux es todavía multi-hilo admitido, es sólo una convención de nomenclatura.
    Véase también https://stackoverflow.com/a/2310892 para esto.

    Es por eso que usted tiene que agregar el -mt sufijo a todos su impulso libs en el enlace opciones en Mac y Windows, pero no en Linux.
    Si usted está usando CMake con Linux co-desarrolladores (como yo) no se puede modificar CMakeLists.txt como este:

    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()
    • En realidad, boost no suelen construir las dos versiones de Mac OS X (con y sin multithreading). Esto no es sólo una convención de nomenclatura y puede desactivar explícitamente el subprocesamiento único variante en homebrew con --without-single. Sin embargo, no hay una sola versión roscada para boost_thread parece.

Dejar respuesta

Please enter your comment!
Please enter your name here