2016-11-22 3 views
2

Итак, я собираюсь бросить свой ноутбук через окно, выйти из окна и пойти и записать Apple HQ.Python3, ошибки компоновщика Boost-Python и Cpp

См Обновление Ниже:

Я не могу получить python3, подталкивание-питон и лязг работать друг с другом. Ошибка, я застрял на работающем:

clang++ <FLAGS/INCLUDES> -o hello.so hello.cpp 

Запускает ответ:

Undefined symbols for architecture x86_64: 
    "__Py_NoneStruct", referenced from: 
     boost::python::api::object::object() in hello-0c512e.o 
    "_main", referenced from: 
    implicit entry/start for main executable 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [hello] Error 1 

Любая помощь будет очень, очень ценится. Думаю, я включил все необходимое. Дайте мне знать, если вам нужна дополнительная информация.

Установка:

  • OSX 10.11.6 (El Сары-s # @%)
  • Необходимо использовать Xcode 7.3 (и соответствующий ЦПТ): Требование NVIDIA для программирования CUDA (установлено) ,
  • Необходимо использовать Python3 (Homebrew установлен)
    • brew install python3
    • which python ->/USR/бен/питон
    • /usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/ Версии/3.5/include/python3.5m
    • Я установил псевдоним для python3.5 (см. Ниже).
  • Использование наддува Python (Homebrew установлен)
    • brew install boost
    • brew install boost-python --with-python3 --without-python
    • /usr/local/Cellar/boost-python/1.62.0/
  • Использование LLVM 3.9.0 (Установлено домашнее устройство)
    • brew install llvm --universal

Теперь несколько полезных вещей, которые вы можете попросить:

Clang ++:

Apple LLVM version 7.3.0 (clang-703.0.29) 
Target: x86_64-apple-darwin15.6.0 
Thread model: posix 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 

ФЛАГИ и включает в Makefile:

CPPFLAGS = -g -Wall -std=c++11 -stdlib=libc++ 
LDHEADERS = -I/usr/local/opt/llvm/include 
LDLIBS = -L/usr/local/opt/llvm/lib 
BOOSTHEADERS = -I/usr/local/Cellar/boost/1.62.0/include/boost 
BOOSTLIBS = -L/usr/local/Cellar/boost-python/1.62.0/lib 
PYTHONHEADERS = -I/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/include/python3.5m 
PYTHONLIBS = -L/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib 

И, наконец, код, который я пытаюсь скомпилировать:

привет.CPP

#include <boost/python.hpp> 

struct World 
{ 
    void set(std::string msg) { this->msg = msg; } 
    std::string greet() { return msg; } 
    std::string msg; 
}; 

using namespace boost::python; 

BOOST_PYTHON_MODULE(hello) 
{ 
    class_<World>("World") 
     .def("greet", &World::greet) 
     .def("set", &World::set) 
    ; 
}; 

ответ

2

После сильной боли и боли, У меня ОТВЕТ!

Для всех тех, кто использует OSX и homebrew, вот как вы это делаете.

  1. brew install python3 Python3 имеет UCS4 native (Unicode), который является неотъемлемой частью этого процесса. Если вам нужен Python2, убедитесь, что он настроен для UCS4, поскольку он является UCS2.
  2. brew install boost Сначала установите общий импульс.
  3. brew install boost-python --with-python3 --without-python Это устанавливает boost-python для Python3 БЕЗ Python2. Вы можете изменить эти параметры, если вам нужен Python2.
  4. brew install llvm --universal Убедитесь, что у вас установлен llvm, в него должен быть включен clang ++, который будет использовать компилятор (а не Xcode).
  5. Создайте файл makefile (см. Ниже), который включает в себя каталоги для всех ваших python и заголовков/библиотек boost, AND включает библиотеки, которые вы хотите использовать. (Это то, что сработало, я имел каталоги, но не указывал, какую библиотеку в этом каталоге должен использовать компилятор).

Мой Makefile:

# compiler flags: 
# -g adds debugging information to the executable file 
# -Wall turns on most, but not all, compiler warnings 

COMPILER = /usr/local/Cellar/llvm/3.9.0/bin/clang++ 
CPPFLAGS = -g -Wall -std=c++11 -stdlib=libc++ 

# Python and BoostPython links. 
BOOSTHEADERS = -I/usr/local/Cellar/boost/1.62.0/include/boost 
BOOSTLIBRARIES = -L/usr/local/Cellar/boost-python/1.62.0/lib/ 
# This is the boost library we want to use, there are also libraries for multithreading etc. 
# All we do is find the file libboost_python3.a and link it by taking away the 'lib' and '.a'. 
BOOSTLIB = -lboost_python3 
PYTHONHEADERS = -I/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/include/python3.5m 
PYTHONLIBRARIES = -L/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib 
# Link to python3.5 library, the same as we did for boost. 
PYTHONLIB = -lpython3.5 

# Collect links. 
LIBRARIES = $(BOOSTLIBRARIES) $(PYTHONLIBRARIES) $(PYTHONLIB) $(BOOSTLIB) 
HEADERS = $(BOOSTHEADERS) $(PYTHONHEADERS) 

# Build target. 
TARGET = hello 


# BEGIN MAKE 
all: $(TARGET) 

$(TARGET): $(TARGET).cpp 
    # Note that '-shared' creates a library that is accessible. 
    $(COMPILER) -shared $(LIBRARIES) $(HEADERS) $(TARGET).cpp -o $(TARGET).so 

clean: 
    $(RM) $(TARGET) 

Тогда все, что вам нужно сделать, это запустить Makefile со всеми включениями, и все должно быть сладким :) Я надеюсь, что это поможет кому-то и снимает боль, которую я имел в попытке для получения insertProfanity активировать работу.

+0

Отличный ответ! Я пытаюсь работать с эквивалентом командной строки для этого же, но я столкнулся с этой проблемой. 'Undefined символы для архитектуры x86_64: " _PyUnicode_FromStringAndSize ", на которые ссылаются: boost :: python :: to_python_value , std :: __ 1 :: allocator > const &> :: operator() (std :: __ 1 :: basic_string , std :: __ 1 :: распределитель > const &) const в ctor-40d36f.o ld: символ (-ы) не найден для архитектуры x86_64 clang: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте -v для вызова вызова) ' –

+0

командной строки:' g ++ classes.cpp -I/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Версии/3.6/include/python3.6m -L/usr/local/Cellar/boost-python/1.64.0/lib -lboost_python3 -lpython -o classes.so -shared' –

3

Не достаточно очков, чтобы комментировать, так, к сожалению, я должен буду размещать в качестве ответа, так как не так давно я проходил через этот же материал ошибки линкера с Boost.

Я думаю, что это, как представляется, проблема линкер Python, в отличие от Boost, проблемы с линкера. Я вижу, что вы добавили Python включает в ваш CXX_INCLUDE_PATH, но как насчет вашей библиотеки Python?

Если путь, о котором вы упомянули выше (этот длинный путь в переменной CXX_INCLUDE_PATH), находится там, где вы включаете то, что [that_long_path]/Versions/3.5/lib должно быть там, где находятся ваши библиотеки Python. Включите эту библиотеку при запуске команды сборки с помощью

clang++ -g -v -std=c++11 -stdlib=libc++ -L/[that_long_path]/Versions/3.5/lib -lpython3.5m hello.cpp -o hello.so 

Флаг -L сообщает компилятору включить в этот каталог, в то время как -l флаг указывает компилятору включить следующую библиотеку. В качестве альтернативы вы можете просто добавить этот lib путь к текущей CXX_INCLUDE PATH, которая будет выглядеть следующим образом:

export CXX_INCLUDE_PATH="/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/include/python3.5m:/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib" 

Также убедитесь, что вы в том числе любого соответствующее подталкивание включают пути и библиотечные пути при запуске команды сборки, чтобы избежать любые больше ошибок компоновщика (если импульс не установлен в местоположении по умолчанию, как usr/local/[some_place]

Затем запустите эту новую команду сборки (может быть в состоянии обойтись без -std and -stdlib флагов:.

clang++ -g -v -std=c++11 -stdlib=lib++ -lpython3.5m -o hello.so hello.cpp 

Подводя итог: 1) Включите файлы заголовков python (которые вы, кажется, сделали) 2) Включите файлы (библиотеки) библиотеки python (которые вам кажутся отсутствующими) 3) Включите любые соответствующие библиотеки ускорений и ускорение (что немного выходит за рамки этого вопроса, но все же стоит отметить)

Надеюсь, это поможет.

+0

Я пробовал, как вы сказали. Я включил 'export CPLUS_INCLUDE_PATH ="/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Версии/3.5/include/python3.5m' с '/usr/local/Cellar/python3/3.5 .2_3/Frameworks/Python.framework/Versions/3.5/lib' и '/ usr/local/Cellar/boost-python/1.62.0/lib', но я все равно получаю ту же ошибку, что и команда сборки, о которой вы говорили (с и без std libs). – NineTails

+0

Должен ли я добавлять динамические библиотеки python? Или файлы python внутри папки lib? Я добавляю все, о чем я могу думать, но все равно не повезло. – NineTails

+0

Ну, я не могу дать вам пример «каждого» варианта использования, я могу просто помочь вам с тем, что сработало для меня с помощью El Captain с Boost 1.62.0 и компилятором clang ++. Некоторые предлагают вручную копировать заголовки boost и .dylib в/usr/local/include и/usr/local/lib соответственно. Я предлагаю сделать это в Makefile или CMake (добавит еще один комментарий, чтобы объяснить далее) – ralston