我正在使用python2.7
构建的复杂项目,该项目使用PyDSTool
package来分析动态系统。 PyDSTool
提供了两个基于C的积分器 - Radau和Dopri - 我想用它来集成我的方程组,其源被编码成一堆C/C++
个文件。
我几乎无法控制包,当我实例化集成器时,我只能添加标头*.H
文件,源文件(*.C
,*.CPP
)并将目录传递给包含在编译器的搜索路径以及要链接的库中。
由于代码的一致部分基于C++11
,我也将参数传递给编译器-std=C++11
。
最终,/PyDSTool/Generators/mixins.py
启动setup
命令(第185行),该命令又从build_ext
运行命令distutils
,并附加所有上述标志。
为了清楚起见:我追加的标志是:
compile options: '-I/usr/lib64/python2.7/site-packages/numpy/core/include -I/home/maurizio/Dropbox/StabilityAnalysis_tmp -I/usr/local/pydstool/PyDSTool/integrator -I/usr/include/python2_7 -I/usr/include/numpy -I/home/maurizio/Dropbox/Ongoing_Projects/pycustommodules -I/home/maurizio/Dropbox/Ongoing_Projects/c_libraries -I/home/maurizio/Dropbox/Ongoing_Projects/c_libraries/models -I/home/maurizio/Dropbox/Ongoing_Projects/DePitta_PNAS/Software/Stability_Analysis/ -I/usr/lib64/python2.7/site-packages/numpy/core/include -I/usr/include/python2.7 -c'
extra options: '-std=c++11 -w -Wno-return-type -Wall -lpython2.7 -lm -lgsl -lgslcblas -D__DOPRI__'
由PyDSTool
发出的结果编译命令为:
error: Command "gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/lib64/python2.7/site-packages/numpy/core/include -I/home/maurizio/Dropbox/StabilityAnalysis_tmp -I/usr/local/pydstool/PyDSTool/integrator -I/usr/include/python2_7 -I/usr/include/numpy -I/home/maurizio/Dropbox/Ongoing_Projects/pycustommodules -I/home/maurizio/Dropbox/Ongoing_Projects/c_libraries -I/home/maurizio/Dropbox/Ongoing_Projects/c_libraries/models -I/home/maurizio/Dropbox/Ongoing_Projects/DePitta_PNAS/Software/Stability_Analysis/ -I/usr/lib64/python2.7/site-packages/numpy/core/include -I/usr/include/python2.7 -c /home/maurizio/Dropbox/StabilityAnalysis_tmp/dop853_temp/ei_network_vf.c -o /home/maurizio/Dropbox/StabilityAnalysis_tmp/dop853_temp/home/maurizio/Dropbox/StabilityAnalysis_tmp/dop853_temp/ei_network_vf.o -std=c++11 -w -Wno-return-type -Wall -lpython2.7 -lm -lgsl -lgslcblas -D__DOPRI__" failed with exit status 1
一旦查看由build.log
自动生成的PyDSTool
文件,就会发现退出状态是由于编译器没有看到所在的C++
库我的代码使用的几个例程/库,例如
/usr/include/blitz/blitz.h:45:18: fatal error: string: No such file or directory
#include <string>
^
Compilation Terminated
现在,这不是我的代码的问题,因为如果我在python中通过独立编译我的代码或通过上面粘贴的相同编译和额外选项通过scipy.weave
编译我的代码,它就可以工作。这是使PyDSTool
在集成器中构建代码的问题。由于我对distutils
和所有gcc
选项不切实际,我希望这里有一些专家可以为我提供一些见解。我怀疑事实上我缺少一些选项或传递给编译器的任何东西。
答案 0 :(得分:1)
只是为了完整起见。我上面提到的问题没有一个简单的解决方法。基于PyDSTool
C
的集成商(即Radau和Dopri)无法使用C++
中的公式的源代码进行编译,但仅限于C
。因此,要么您使用普通C
重新设置代码,要么尝试修改PyDSTool
个集成商并在C++
中重新设置它们。第一种选择可能是目前唯一可能的选择(至少对于一些非专家来说,正在写作)。