gpt4 book ai didi

python - 使用 Homebrew 在 Mac OS X 上构建 python-boost hello world - Makefile vs. Resolution

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:31 30 4
gpt4 key购买 nike

虽然不是直接明确的问题 - 我正在尝试发表一篇文章来解决在尝试安装 boost-python 作为新手时遇到的一些奇怪问题

该帖子基于this example可以直接得到

wget https://dl.dropboxusercontent.com/u/508241/wordpress/BoostPythonHelloWorld.tar.gz
tar xf BoostPythonHelloWorld.tar.gz
cd BoostPythonHelloWorld
cmake .
make
./test.py

一个大胆但准确的声明是,我已经系统地阅读了 所有 “boost-python hello world Makefile” 的相关谷歌搜索结果(没有那么多)并通过搜索 boost-python hello world Makefile 时出现的每个 SO 帖子。我尝试过的方法显然是相当详尽的,我也尝试了大量的例子。

问题

为了便于阅读,我在 Makefile 方面取得的最大成功是在这篇文章的末尾。这些问题主要基于此。

  • 第一个相当简单,brew install boost-python 会在类似 /usr/Cellar/boost/1.61.0/ 的地方安装 boost,这会导致大多数在线除非明确链接,否则资源将失败
  • Mac OS X 自带 python。像大多数用户那样安装 homebrew install python 会导致 cmake 错误地链接到原生 python。
  • 我们必须显式链接 pythonlibpython2.7.dylib
  • 下面的 Makefile 的一些组合实际上编译为 100% 但后来我有以下内容,这似乎来自 boost -python 无法链接到 cpython:

     [ 25%] Building CXX object CMakeFiles/greet.dir/greet.cpp.o
    [ 50%] Linking CXX shared library libgreet.dylib
    [ 50%] Built target greet
    [ 75%] Building CXX object CMakeFiles/greet_ext.dir/greet_ext.cpp.o
    [100%] Linking CXX shared library greet_ext.dylib
    Undefined symbols for architecture x86_64:
    "_PyArg_ParseTupleAndKeywords", referenced from:

    我更改了我的 Makefile 并没有清理我的 Build/ 几次,当我意识到我忘记清除旧文件时​​,我已经更改了我的 Makefile 太多,无法重现这种成功

  • 删除 SHARED 编译没有错误,但我无法导入,因为我应该能够使用 import greet_ext

生成文件

project( BoostPythonHelloWorld )
cmake_minimum_required(VERSION 3.3)

set(Boost_REALPATH ON)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost COMPONENTS
regex
filesystem
system
thread
python
chrono
date_time
atomic
REQUIRED)
# include extras
message("")
message("CMAKE finds wrong dirs of Boost (Mac OSX default)...")
message("... Include Include of boost: " ${Boost_INCLUDE_DIRS} )
set(Boost_INCLUDE_DIRS "/usr/Cellar/boost/1.61.0/")
set(Boost_INCLUDE_DIRS "/usr/Cellar/boost/1.61.0/include")
message("... Actual Include of boost: " ${Boost_INCLUDE_DIRS}} )

find_package(PythonLibs 2.7 REQUIRED)
message("")
message("CMAKE finds wrong dirs of Python (Mac OSX default)...")
message("... Include dirs of Python: " ${PYTHON_INCLUDE_DIRS} )
message("... Libs of Python: " ${PYTHON_LIBRARIES} )
set(PYTHON_LIBRARIES "/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib")
set(PYTHON_INCLUDE_DIRS "/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/include/python2.7")
message("... Actual Include: " ${PYTHON_INCLUDE_DIRS} )
message("... Actual lib: " ${PYTHON_LIBRARIES} )

# Build our library
add_library( greet SHARED greet.cpp )

# Define the wrapper library that wraps our library
add_library( greet_ext SHARED greet_ext.cpp )
target_link_libraries( greet_ext ${Boost_LIBRARIES} greet )
# don't prepend wrapper library name with lib
set_target_properties( greet_ext PROPERTIES PREFIX "" )

Makefile输出

使用命令:rm -rf Build; mkdir 构建;光盘构建;制作..; make; 在目录 BoostPythonHelloWorld 我得到:

CMAKE finds wrong dirs of Boost (Mac OSX default)...
... Include Include of boost: /usr/local/include
... Actual Include of boost: /usr/Cellar/boost/1.61.0/include}
-- Found PythonLibs: /usr/lib/libpython2.7.dylib (found suitable version "2.7.10", minimum required is "2.7")

CMAKE finds wrong dirs of Python (Mac OSX default)...
... Include dirs of Python: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/python2.7
... Libs of Python: /usr/lib/libpython2.7.dylib
... Actual Include: /usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/include/python2.7
... Actual lib: /usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/alex/Downloads/BoostPythonHelloWorld/Build
Scanning dependencies of target greet
[ 25%] Building CXX object CMakeFiles/greet.dir/greet.cpp.o
[ 50%] Linking CXX shared library libgreet.dylib
clang: error: invalid argument '-bundle' not allowed with '-dynamiclib'
make[2]: *** [libgreet.dylib] Error 1
make[1]: *** [CMakeFiles/greet.dir/all] Error 2
make: *** [all] Error 2

最佳答案

这并没有直接解决 Makefile 问题,而是让其他 python 用户意识到我的突破,即 Makefile 不是必需的。

我仍然会接受导致通过 Makefile 尝试进行修复的任何答案。

使用不同的示例 hello_ext.cpp:

char const* greet()
{
return "hello, world";
}

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}

我能够使用取自 this postsetup.py 将其导入 python :

from distutils.core import setup
from distutils.extension import Extension

hello_ext = Extension(
'hello_ext'
,sources=['hello_ext.cpp']
,libraries=['boost_python-mt'] # for python 3 use 'boost_python3-mt'
# you may also want to add these
,extra_compile_args=['-std=c++11','-stdlib=libc++']
,extra_link_args=['-stdlib=libc++']
)

setup(
name='hello-world',
version='0.1',
ext_modules=[hello_ext])

构建:python setup.py build_ext --inplace 我能够成功导入!

In [1]: ls
Makefile build/ hello_ext.cpp hello_ext.so* setup.py

import hello_ext
hello_ext.greet()

## -- End pasted text --
Out[2]: 'hello, world'

作为旁注:以下是我的 ~/.bash_profile

export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/usr/include/python2.7/"
export BOOST_ROOT='/usr/Cellar/boost/1.61.0/'
export BOOST_INC="/usr/Cellar/boost/1.61.0/include"
export BOOST_LIB="/usr/Cellar/boost/1.61.0/lib"

关于python - 使用 Homebrew 在 Mac OS X 上构建 python-boost hello world - Makefile vs. Resolution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38778676/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com