Ссылка с 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
Ответы
Ответ 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()