Ссылка с Boost (Homebrew) Mac С++ - программирование

Ссылка с Boost (Homebrew) Mac С++

Привет, я пытаюсь связать с boost, чтобы использовать библиотеку потоков, но не может показаться, что он создан.

Я установил boost с помощью HomeBrew (установщик пакета mac) и находится в каталоге /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
4b9b3361

Ответ 1

ЕСЛИ вы только что использовали brew install boost без параметров, это создает 64-битный двоичный файл - как статический, так и динамический.

Ваш главный виновник из приведенного выше кода - это использование опции -m32, удалите это, и вы должны быть в порядке. Это означает, что вы пытаетесь связать 32-битную сборку с 64-разрядной библиотекой.

Библиотеки Boost символически связаны с фактическими бинарниками и заголовками в /usr/local/Cellar/ - (/usr/local/lib и /usr/local/include). Ваша PATH должна включать их, поэтому нет необходимости указывать их в вашем файле.

Обратите внимание, что brew (по расширению gcc) обычно строит 64-разрядные двоичные файлы по умолчанию, из которых с вашего вывода ошибок были созданы библиотеки Boost. (вы можете проверить, какая архитектура является библиотекой, используя эти инструменты otool, file или lipo)

Ответ 2

Как указано Jesse Good, у вас есть проблема с суффиксом -mt. Для всех снова запускаемых в это (даже в Windows):

Оказывается, что суффикс -mt (для поддержки многопоточности) не используется в установках Linux boost, а на Mac и других. Boost на Linux по-прежнему поддерживается несколькими потоками, это просто соглашение об именах. См. Также fooobar.com/info/197368/... для этого.

Вот почему вам нужно добавить суффикс -mt ко всем вашим файлам boost в настройках ссылок на Mac и Windows, но не в 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()