【问题标题】:How to build pgmagick under pythonbrew on OS X?如何在 OS X 上的 pythonbrew 下构建 pgmagick?
【发布时间】:2012-03-20 12:12:52
【问题描述】:

在使用 XCode 4.3.1 在 OS X Lion 上构建 pgmagick 时,我没有取得多大成功。

我使用以下命令(通过自制软件)安装了 ImageMagick 和 GraphicsMagick,以及 boost:

$ brew install graphicsmagick --with-magick-plus-plus
$ brew install imagemagick --with-magick-plus-plus
$ brew install boost --with-thread-unsafe

然后我将在https://bitbucket.org/hhatto/pgmagick 克隆回购:

$ hg clone https://bitbucket.org/hhatto/pgmagick/src
$ cd pgmagick
$ python setup.py build

但是我总是收到以下错误:

ld: library not found for -lboost_python
collect2: ld returned 1 exit status

根据 stdout 上的输出,设置 正在寻找提升的正确位置 (/usr/local/lib)。

我也尝试过easy_installpip,但没有成功。我正在使用 Pythonbrew,但也禁用了它并尝试使用股票 python 安装 - 仍然没有成功。

关于如何解决问题或进一步诊断问题的任何建议?

【问题讨论】:

  • Lion 附带 Python 2.7?尝试 brew edit boost s.t. bootstrap.sh 使用--python-version=2.6 调用。
  • @PauloScardine --python-version=2.6 的 boost.rb 中没有任何内容。
  • 等一下:您正在以非特权用户的身份执行此操作。出于好奇,您的安装目标是否被错误地扔进了~/.pythonbrew
  • @MrGomez 是否以非特权用户身份完成是否重要? 一切都以非特权用户身份完成,包括安装 boost/graphicsmagick(使用自制软件)。尝试通过sudo 构建也失败了。
  • @unpluggd 是的。据我了解,brew 会安装到您的本地用户副本(默认为~.pythonbrew),除非您另有说明。我在这里的唯一目标是确保您的 boost 和 pgmagick 副本安装在正确的目录中,因为您没有在调用中对它们进行 sudo,并且对 /usr/local/lib 的写访问权应该锁定为 root .

标签: python macos pythonbrew


【解决方案1】:

根据我自己在 brew 0.9 和 OSX 10.6.8 中对此问题的重现,问题是 --with-thread-unsafe 没有被当前的 brew 公式文件认可。您可以通过使用 brew edit boost 检查公式并查看该选项是否出现在公式的内容中来验证这一点。

因此,正在构建 libboost_python-mt.alibboost_python-mt.dylib,而不是 libboost_python.alibboost_python.dylib

解决此问题的最简单方法是编辑您的 pgmagick setup.py 以将 boost_lib="boost_python" 替换为 boost_lib="boost_python-mt"(如 here 指出的那样)或关注 the instructions and patch here。这是一个已知问题。

【讨论】:

  • 我没有接触setup.py 文件,而是应用了来自github pull request 的补丁,这似乎 有效(import pgmagick 不会抛出错误,但没有'还没用)。
  • @unpluggd 它不应该。这里的区别是线程不安全的 boost 是通过 brew 安装的,这可能只会使那些依赖于 boost 的多线程部分的程序失败(所有线程相关的操作都将被替换为无操作)。对于那些不需要多线程的程序,两个版本都可以。
  • @MrGomez:是的,谢谢!尽管 pgmagick 的文档和用法令人沮丧(我似乎找不到写入流而不是文件的方法),但它确实有效。 :)
【解决方案2】:

/usr/local/lib/ 中的 boost_python 库以 libboost_python-mt.a 和 libboost_python-mt.dylib 命名,因为默认编译是启用了多线程支持。

在 setup.py 中的 ELSE 条件下 Grep boost_lib="boost_python" 并将其替换为 boost_lib="boost_python-mt",将修复“未找到”问题。

也可以将“-mt”版本添加到 libboost_python.a:如here for linux boost 所述,自 1.42 起不再附加“-mt”后缀。

忽略这一行或者你可以“with-boost-python=boost_python-mt python setup.py install”。 您可以将“--with-boost-python=boost_python-mt”附加到 setup.py 中的 extra_compile_args,以实现相同的目标。

此外,您可以通过 pip 在托管环境中安装 pgmagick。参考http://rohanradio.com/blog/2011/12/02/installing-pgmagick-on-os-x/

【讨论】:

  • 并且,如勘误表中所述:--with-thread-unsafebrew 中的当前升压公式文件忽略。预期的行为是生成libboost_python.a,而不是libboost_python-mt.a。不过建议很好!
  • ...虽然,我在我的盒子上尝试了这个程序,但没有成功。
  • @MrGomez 有什么错误?我没有在 OSX 10.6.8 上测试过它。在 10.7 w/更新的 brew 上,生成了 _pgmagick.so 并且运行良好。
  • 这似乎不向后兼容 10.6.8。第一次调用显然扰乱了 Bash (-bash: with-boost-python=boost_python-mt: command not found),第二次调用扰乱了 cc1plus 和extra_compile_args=["--with-boost-python=boost_python-mt"] (cc1plus: error: unrecognized command line option "-fwith-boost-python=boost_python-mt)。我想这只是一件事,因为 10.7 是真正需要的。 :)
  • @MrGomez 这是有道理的。您是否尝试过将“boost_python”替换为“boost_python-mt”的第一种方法?
【解决方案3】:

请注意,自 2014 年 7 月起,boost Python 库是一个名为 boost-python 的独立自制程序包。

5254f8f510fb30484f8fac8be3d38e388a4392e2
Author: Tim D. Smith <git@tim-smith.us>
Date:   Sat Jul 19 15:37:25 2014 -0700

    Split out Boost.Python

需要单独安装才能获得libboost_python共享库。

【讨论】:

  • brew instal boost-python 在我的机器上解决了这个错误。我正在运行 Mac 10.9
【解决方案4】:

在构建之前在环境中设置DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib 是否有帮助

例如

$ export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib
$ hg clone https://bitbucket.org/hhatto/pgmagick/src
$ cd pgmagick
$ python setup.py build

【讨论】:

    【解决方案5】:

    我已经 submitted a pull request 使用自制程序来构建 Boost,其中包含构建 pgmagick 所需的 mt 和非 mt(线程和线程不安全)二进制文件。

    原来这是一个相当普遍的问题,在补丁被接受之前,你可以查看或使用我的公式为 Boost 构建 pgmagick。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 2015-07-31
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      相关资源
      最近更新 更多