添加共享库时scons编译失败
scons compilation fails when adding shared library
我参与了一个包含C++、Fortran和Python的项目,编译是用scons做的。我尝试修改构建脚本以生成共享库:
diff --git a/src/scons/scons_ext/utils.py b/src/scons/scons_ext/utils.py
index bddadd6..896b2aa 100644
--- a/src/scons/scons_ext/utils.py
+++ b/src/scons/scons_ext/utils.py
@@ -650,6 +650,8 @@ to highly recommended debugging and optimization options.
program_dependencies = [self.rebase_dir(build_dir, target)] \
+ src_dependencies + dir_dependencies
program = env.Program(program_name, program_dependencies)
+ if 'ssh-aerosol.f90' in target:
+ mylib = env.SharedLibrary('ssh-aerosol.so', program_dependencies)
if program_name in self.command_line_target:
BUILD_TARGETS.append(program_name + env["PROGSUFFIX"])
但是修改后,我不得不运行编译脚本~5次才能在src
文件夹中生成.so
文件。我怀疑 scons 脚本没有以正确的顺序编译文件/在我修改后不理解文件之间的依赖关系。
2019 年 9 月 30 日之前可在此处获得代码的开发版本(不久将通过开源许可发布):https://cloud.enpc.fr/s/mKNc4KZF6KKoWiB
编辑:获得工作库所需的编译运行s 的数量是可变的。该项目是在主目录中使用 ./compile
命令编译的。在日志文件中重定向 stdout 和 stderr 的编译输出显示这种错误:
gfortran -o .build/default/include/Module/ModuleAdaptstep.os -c -cpp -O2 -g3 -I /usr/include -cpp -Waliasing -Wampersand -Wsurprising -Wintrinsics-std -Wintrinsic-shadow -Wline-truncation -Wreal-q-constant -fPIC -DPOLYPHEMUS_WITH_AEROSOL_MODULE -DWITHOUT_NACL_IN_THERMODYNAMICS -DPOLYPHEMUS_SINGLE_UNDERSCORE -DPOLYPHEMUS_FASTJX -I. -Iinclude/common -Iinclude/Talos -Iinclude/SeldonData -Iinclude/AtmoData -Iinclude/isorropia_aec -Iinclude/fastJX -Iinclude/CHEMISTRY/cb05en -Iinclude/CHEMISTRY/common_scram -Iinclude/INC -Iinclude/RDB -Iinclude/SOAP -Iinclude/Module -I/usr/include include/Module/ModuleAdaptstep.F90
AttributeError: 'NoneType' object has no attribute 'get_build_env':
File "/usr/lib/scons/SCons/Script/Main.py", line 1376:
_exec_main(parser, values)
File "/usr/lib/scons/SCons/Script/Main.py", line 1339:
_main(parser)
File "/usr/lib/scons/SCons/Script/Main.py", line 1103:
nodes = _build_targets(fs, options, targets, target_top)
File "/usr/lib/scons/SCons/Script/Main.py", line 1313:
jobs.run(postfunc = jobs_postfunc)
File "/usr/lib/scons/SCons/Job.py", line 111:
self.job.start()
File "/usr/lib/scons/SCons/Job.py", line 423:
task.executed()
File "/usr/lib/scons/SCons/Script/Main.py", line 237:
SCons.Taskmaster.OutOfDateTask.executed(self)
File "/usr/lib/scons/SCons/Taskmaster.py", line 312:
t.push_to_cache()
File "/usr/lib/scons/SCons/Node/FS.py", line 2910:
self.get_build_env().get_CacheDir().push(self)
File "/usr/lib/scons/SCons/Node/__init__.py", line 624:
result = self.get_executor().get_build_env()
f951: Fatal Error: Can't rename module file ‘ldiscretization.mod0’ to ‘ldiscretization.mod’: Aucun fichier ou dossier de ce type
compilation terminated.
f951: Fatal Error: Can't rename module file ‘hcongregation.mod0’ to ‘hcongregation.mod’: No such file or directory
compilation terminated.
scons: *** [.build/default/include/Module/ModuleCongregation.o] Error 1
scons: building terminated because of errors.
use cThermodynamics
1
Fatal Error: Can't open module file ‘cthermodynamics.mod’ for reading at (1): No such file or directory
compilation terminated.
include/Module/ModuleDiscretization.F90:7:6:
use eRedistribution
1
Fatal Error: Can't open module file ‘eredistribution.mod’ for reading at (1): No such file or directory
compilation terminated.
scons: *** [.build/default/include/Module/ModuleRedistribution.o] Error 1
scons: *** [.build/default/include/Module/ModuleDiscretization.os] Error 1
scons: building terminated because of errors.
AttributeError: 'NoneType' object has no attribute 'get_build_env':
File "/usr/lib/scons/SCons/Script/Main.py", line 1376:
_exec_main(parser, values)
File "/usr/lib/scons/SCons/Script/Main.py", line 1339:
_main(parser)
File "/usr/lib/scons/SCons/Script/Main.py", line 1103:
nodes = _build_targets(fs, options, targets, target_top)
File "/usr/lib/scons/SCons/Script/Main.py", line 1313:
jobs.run(postfunc = jobs_postfunc)
File "/usr/lib/scons/SCons/Job.py", line 111:
self.job.start()
File "/usr/lib/scons/SCons/Job.py", line 423:
task.executed()
File "/usr/lib/scons/SCons/Script/Main.py", line 237:
SCons.Taskmaster.OutOfDateTask.executed(self)
File "/usr/lib/scons/SCons/Taskmaster.py", line 312:
t.push_to_cache()
File "/usr/lib/scons/SCons/Node/FS.py", line 2910:
self.get_build_env().get_CacheDir().push(self)
File "/usr/lib/scons/SCons/Node/__init__.py", line 624:
result = self.get_executor().get_build_env()
编译问题的解决方案好像是:
program_dependencies = [self.rebase_dir(build_dir, target)] \
+ src_dependencies + dir_dependencies
program = env.Program(program_name, program_dependencies)
# Generate shared library for ssh-aerosol
if 'ssh-aerosol.f90' in target:
- mylib = env.SharedLibrary('ssh-aerosol.so', program_dependencies)
+ mylib = env.SharedLibrary('ssh-aerosol.so', 'ssh-aerosol.f90')
if program_name in self.command_line_target:
BUILD_TARGETS.append(program_name + env["PROGSUFFIX"])
# In case another SConstruct wants to depend on this source
# directory:
我参与了一个包含C++、Fortran和Python的项目,编译是用scons做的。我尝试修改构建脚本以生成共享库:
diff --git a/src/scons/scons_ext/utils.py b/src/scons/scons_ext/utils.py
index bddadd6..896b2aa 100644
--- a/src/scons/scons_ext/utils.py
+++ b/src/scons/scons_ext/utils.py
@@ -650,6 +650,8 @@ to highly recommended debugging and optimization options.
program_dependencies = [self.rebase_dir(build_dir, target)] \
+ src_dependencies + dir_dependencies
program = env.Program(program_name, program_dependencies)
+ if 'ssh-aerosol.f90' in target:
+ mylib = env.SharedLibrary('ssh-aerosol.so', program_dependencies)
if program_name in self.command_line_target:
BUILD_TARGETS.append(program_name + env["PROGSUFFIX"])
但是修改后,我不得不运行编译脚本~5次才能在src
文件夹中生成.so
文件。我怀疑 scons 脚本没有以正确的顺序编译文件/在我修改后不理解文件之间的依赖关系。
2019 年 9 月 30 日之前可在此处获得代码的开发版本(不久将通过开源许可发布):https://cloud.enpc.fr/s/mKNc4KZF6KKoWiB
编辑:获得工作库所需的编译运行s 的数量是可变的。该项目是在主目录中使用 ./compile
命令编译的。在日志文件中重定向 stdout 和 stderr 的编译输出显示这种错误:
gfortran -o .build/default/include/Module/ModuleAdaptstep.os -c -cpp -O2 -g3 -I /usr/include -cpp -Waliasing -Wampersand -Wsurprising -Wintrinsics-std -Wintrinsic-shadow -Wline-truncation -Wreal-q-constant -fPIC -DPOLYPHEMUS_WITH_AEROSOL_MODULE -DWITHOUT_NACL_IN_THERMODYNAMICS -DPOLYPHEMUS_SINGLE_UNDERSCORE -DPOLYPHEMUS_FASTJX -I. -Iinclude/common -Iinclude/Talos -Iinclude/SeldonData -Iinclude/AtmoData -Iinclude/isorropia_aec -Iinclude/fastJX -Iinclude/CHEMISTRY/cb05en -Iinclude/CHEMISTRY/common_scram -Iinclude/INC -Iinclude/RDB -Iinclude/SOAP -Iinclude/Module -I/usr/include include/Module/ModuleAdaptstep.F90
AttributeError: 'NoneType' object has no attribute 'get_build_env':
File "/usr/lib/scons/SCons/Script/Main.py", line 1376:
_exec_main(parser, values)
File "/usr/lib/scons/SCons/Script/Main.py", line 1339:
_main(parser)
File "/usr/lib/scons/SCons/Script/Main.py", line 1103:
nodes = _build_targets(fs, options, targets, target_top)
File "/usr/lib/scons/SCons/Script/Main.py", line 1313:
jobs.run(postfunc = jobs_postfunc)
File "/usr/lib/scons/SCons/Job.py", line 111:
self.job.start()
File "/usr/lib/scons/SCons/Job.py", line 423:
task.executed()
File "/usr/lib/scons/SCons/Script/Main.py", line 237:
SCons.Taskmaster.OutOfDateTask.executed(self)
File "/usr/lib/scons/SCons/Taskmaster.py", line 312:
t.push_to_cache()
File "/usr/lib/scons/SCons/Node/FS.py", line 2910:
self.get_build_env().get_CacheDir().push(self)
File "/usr/lib/scons/SCons/Node/__init__.py", line 624:
result = self.get_executor().get_build_env()
f951: Fatal Error: Can't rename module file ‘ldiscretization.mod0’ to ‘ldiscretization.mod’: Aucun fichier ou dossier de ce type
compilation terminated.
f951: Fatal Error: Can't rename module file ‘hcongregation.mod0’ to ‘hcongregation.mod’: No such file or directory
compilation terminated.
scons: *** [.build/default/include/Module/ModuleCongregation.o] Error 1
scons: building terminated because of errors.
use cThermodynamics
1
Fatal Error: Can't open module file ‘cthermodynamics.mod’ for reading at (1): No such file or directory
compilation terminated.
include/Module/ModuleDiscretization.F90:7:6:
use eRedistribution
1
Fatal Error: Can't open module file ‘eredistribution.mod’ for reading at (1): No such file or directory
compilation terminated.
scons: *** [.build/default/include/Module/ModuleRedistribution.o] Error 1
scons: *** [.build/default/include/Module/ModuleDiscretization.os] Error 1
scons: building terminated because of errors.
AttributeError: 'NoneType' object has no attribute 'get_build_env':
File "/usr/lib/scons/SCons/Script/Main.py", line 1376:
_exec_main(parser, values)
File "/usr/lib/scons/SCons/Script/Main.py", line 1339:
_main(parser)
File "/usr/lib/scons/SCons/Script/Main.py", line 1103:
nodes = _build_targets(fs, options, targets, target_top)
File "/usr/lib/scons/SCons/Script/Main.py", line 1313:
jobs.run(postfunc = jobs_postfunc)
File "/usr/lib/scons/SCons/Job.py", line 111:
self.job.start()
File "/usr/lib/scons/SCons/Job.py", line 423:
task.executed()
File "/usr/lib/scons/SCons/Script/Main.py", line 237:
SCons.Taskmaster.OutOfDateTask.executed(self)
File "/usr/lib/scons/SCons/Taskmaster.py", line 312:
t.push_to_cache()
File "/usr/lib/scons/SCons/Node/FS.py", line 2910:
self.get_build_env().get_CacheDir().push(self)
File "/usr/lib/scons/SCons/Node/__init__.py", line 624:
result = self.get_executor().get_build_env()
编译问题的解决方案好像是:
program_dependencies = [self.rebase_dir(build_dir, target)] \
+ src_dependencies + dir_dependencies
program = env.Program(program_name, program_dependencies)
# Generate shared library for ssh-aerosol
if 'ssh-aerosol.f90' in target:
- mylib = env.SharedLibrary('ssh-aerosol.so', program_dependencies)
+ mylib = env.SharedLibrary('ssh-aerosol.so', 'ssh-aerosol.f90')
if program_name in self.command_line_target:
BUILD_TARGETS.append(program_name + env["PROGSUFFIX"])
# In case another SConstruct wants to depend on this source
# directory: