- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 OSX 上,试图用 distutils 的 setup.py 在 C 中编译一个共享库(使用 ctypes 在 python 中使用)。我是 distutils 的新手,但是当我要编译的共享库 (libreboundx.so) 依赖于另一个共享库 (librebound.so) 时,我遇到了问题。明确地,在 modify_orbits_direct.c 中我有
#include "rebound.h"
rebound.h在目录/Users/dt/rebound/src/下,rebound.h中的所有函数都在/Users/dt/rebound/下的共享库librebound.so中。
与 cc 的链接看起来像。
cc -fPIC -shared reboundx.o -L/Users/dt/rebound -lrebound -o libreboundx.so
更新:这种情况看起来与第 2 节末尾的示例完全一样。 3 在 https://docs.python.org/2/extending/building.html .我已经更新了我的 setup.py 以模仿那个:
libreboundxmodule = Extension('libreboundx',
sources = [ 'src/reboundx.c',
'src/modify_orbits_direct.c'],
include_dirs = ['src', '/Users/dt/rebound/src'],
extra_compile_args=['-fstrict-aliasing', '-O3','-std=c99','-march=native', '-D_GNU_SOURCE', '-fPIC'],
library_dirs=['/Users/dt/rebound'],
libraries=['rebound'],
)
这在我运行时安装正常
pip install -e ./
构建输出:
You are using pip version 7.0.3, however version 7.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Obtaining file:///Users/dtamayo/Documents/workspace/reboundx
Installing collected packages: reboundx
Running setup.py develop for reboundx
Successfully installed reboundx-1.0
但是当我尝试
import reboundx
在 Python 中,我得到一个 OSError: dlopen(libreboundx.so, 10): Symbol not found: _reb_boundary_particle_is_in_box,这是另一个库 (librebound.so) 中的一个函数,它甚至没有在代码中被调用对于 libreboundx.so。
如果我将共享库与上面的 cc 命令链接,一切正常,并且我可以在 C 中使用共享库 libreboundx.so 非常好。如果我尝试使用相同的 libreboundx.so,我将使用 cc 命令进行编译,并且把它贴在 setup.py 会放的地方,然后尝试在 python 中导入 reboundx,我反而得到了
OSError: dlopen(/Users/dtamayo/Documents/workspace/reboundx/reboundx/../libreboundx.so, 10): Library not loaded: librebound.so
引用自:/Users/dtamayo/Documents/workspace/reboundx/libreboundx.so 原因:找不到图片
这会不会像 rpath 问题,在运行时 libreboundx.so 不知道在哪里寻找 librebound.so?
最佳答案
感谢所有建议。我应该在问题中指定,最后我想要一个可以打包以上传到 PyPy 的解决方案,以便用户可以使用单个命令进行安装。它还应该在 OSX 和 Linux 上运行,所以我更喜欢不涉及 install_name_tool 的解决方案。
我还没有能够测试它,但我想添加
runtime_library_dirs=['/Users/dt/rebound'],
library_dirs 旁边应该可以解决 Linux 上的问题。显然这在 Mac 上不起作用,但您可以使用 extra_link_args。在上面发布的 libreboundxmodule 定义下面添加它,
if platform.system() == 'Darwin':
extra_link_args.append('-Wl,-rpath,'+'/Users/dtamayo/Documents/workspace/rebound')
解决了我的问题。我在这里找到了答案:Python runtime_library_dirs doesn't work on Mac
关于python - 使用 distutils 的 setup.py 编译 C 共享库,当库依赖于第二个共享库时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32283062/
是否有任何库或框架旨在促进从另一种成熟的编程语言中构建项目? 在 C++、java 等编程语言中指定逻辑、集合和复杂规则非常容易,但在 Makefile 中完成这些事情似乎是一场艰苦的战斗。我还没有深
我有这段代码可以用 clang 编译得很好(即使使用 -Weverything),但是 gcc 会发出错误。 #include #include #include using namespace
我有以下 block 头文件 BKE_mesh.h: /* Connectivity data */ typedef struct IndexNode { struct IndexNode *
我在我的一个项目中遇到了一个奇怪的问题。我的代码库依赖于一个外部库,其中包含一个名为 Dataset 的类. Dataset类私有(private)继承自 std::vector (其中 Sample
当使用 gcc、g++ 或 make 在终端中编译一个小型 C 或 C++ 项目时,我收到以下错误: /tmp/ccG1caGi.o: In function `main': main.c:(.tex
我正在尝试从 CVS 为 Windows 上的 Emacs 23.1.50 编译 CEDET,但在“第 6 步:打开 EDE...”时出现错误:“defvar:作为变量的符号值是无效的:cedet-m
我正在(重新)学习编程,我从 C 开始。我的 IDE(如果我可以这么说)是 Windows7 上的 cygwin(32 位)和 Visual-Studio 2010。我总是编译我用 gcc (cygw
我喜欢在模板类中使用本地类来执行类似“static if”的构造。但是我遇到了 gcc 4.8 不想编译我的代码的问题。但是 4.7 可以。 这个例子: #include #include #in
我有一个项目,必须仅使用 java 1.4 进行编译。但我计划使用mockito 编写一些单元测试。我想要一种在 pom 中指定的方法,以便 src/main/java 使用 jdk 1.4 编译,但
我想了解 PHP 编译过程是如何工作的。 假设我有一个名为funcs.php 的文件并且这个文件有三个函数,如果我include 或require 它,所有的在文件加载期间编译三个函数?或者源代码会被
编译工具链 我们写程序的时候用的都是集成开发环境 (IDE: Integrated Development Environment),集成开发环境可以极大地方便我们程序员编写程序,但是配置起来
当我编写一些 Scala 代码时,在尝试编译代码时收到一条奇怪的错误消息。我将代码分解为一个更简单的代码(从语义的角度来看这完全没有意义,但仍然显示了错误)。 scala> :paste // Ent
我正在编译一个 SCSS 文件,它似乎删除了我的评论。我可以使用什么命令来保留所有评论? >SASS input.scss output.css 我在 SCSS 中看到两种类型的注释。 // Comm
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
当您编译 grails war 时,我知道 .groovy 代码被编译为字节码类文件,但我不明白容器(例如 tomcat)如何在请求 GSP 时知道如何编译它们。容器了解 GSP 吗?安装在服务器上的
我正在努力将多个文件编译成一个通用程序。我收到一个错误: undefined reference to 'pi' 这是我的代码和 Makefile 的框架。我做错了什么?谢谢! 文件:calcPi.c
我尝试使用 LD_PRELOAD 来 Hook sprintf function ,所以我将打印到缓冲区的结果: #define _GNU_SOURCE #include #include int
我正在寻找最简单的方法来自动将 CoffeeScript 重新编译为 JS。 阅读documentation但仍然很难得到我想要的东西。 我需要它来监视文件夹 src/ 中的任何 *.coffee 文
我想使用定制waveformjs 。我发现this on SO但是,我不知道如何编译/安装波形来开始。我从 GitHub 克隆它并进行了更改,但是我不知道如何将其转换为 .js 文件。 最佳答案 为了
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是一名优秀的程序员,十分优秀!