2016-11-22 85 views
2

因此,我即将把笔记本电脑从窗口扔出窗外,然后继续刻录Apple HQ。Python3,Boost-Python和Cpp链接器错误

查看更新下面:

我不能让python3,升压Python和铛相互合作。我被困在错误运行:

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(萨尔瓦多CAPI-S#@%)
  • 必须使用的Xcode 7.3(及相应的CLT):用于CUDA编程NVIDIA的要求(安装) 。
  • 必须使用Python3(自制安装)
    • 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(自制安装)
    • 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

现在一些有用的东西,你可能会问:

锵++:

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 

标志和在生成文件包括:

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和自制软件的人来说,以下是您的操作方法。

  1. brew install python3 Python3具有UCS4原生(Unicode),这是该过程的重要部分。如果你需要Python2,那么确保它是为UCS4配置的,因为它本身就是UCS2。
  2. brew install boost先安装一般提升。
  3. brew install boost-python --with-python3 --without-python这会为Python3安装boost-python而不是Python2。如果你需要Python2,你可以改变这些选项。
  4. brew install llvm --universal确保你已经安装了llvm,它应该包含clang ++,它是我们将使用的编译器(而不是Xcode的)。
  5. 创建一个包含所有python和boost头文件/库的目录的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) 

然后,所有你需要做的是与所有的包裹运行生成文件,一切都应该是甜:)我希望这可以帮助别人,并删除了痛苦,我有试图得到insertProfanity助力工作。

+0

很好的答案!我试图在相同的命令行上工作,但我遇到了这个问题。 '架构x86_64的未定义符号: “_PyUnicode_FromStringAndSize”,引用来自: boost :: python :: to_python_value ,std :: __ 1 :: allocator > const&> :: operator()(std :: __ 1 :: basic_string ,std :: __ 1 :: allocator > const&)const in ctor-40d36f.o ld:符号未找到体系结构x86_64 clang:错误:链接器命令失败,退出代码1(使用-v查看调用)' –

+0

命令行:'g ++ classes.cpp -I/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/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连接问题,而不是一个升压连接问题。我发现你已经将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路径,这会再看看这样的:

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)包括任何相关的boost库和boost包括目录(这是有点超出了这个问题的范围,但仍值得注意)

希望这会有所帮助。

+0

我按照你的说法试过了。我已经用'/usr/local/Cellar/python3/3.5包含'export CPLUS_INCLUDE_PATH =“/ usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/include/python3.5m' .2/3/Frameworks/Python.framework/Versions/3.5/lib'和'/ usr/local/Cellar/boost-python/1.62.0/lib',但是我仍然遇到了你提到的build命令有或没有标准库) – NineTails

+0

我应该添加python动态库吗?还是lib文件夹中的python文件?我添加了我可能想到的所有东西,但仍然没有运气。 – NineTails

+0

嗯,我不能给你一个'every'用例的例子,我可以帮助你使用Boost 1.62.0和clang ++编译器运行El Captain。有些人建议手动将boost头文件和.dylib文件复制到/ usr/local/include和/ usr/local/lib,我建议在你的Makefile或CMake中做这个(将添加另一个注释来进一步解释) – ralston