计算化学公社

标题: GCC版本太新了确实不好 [打印本页]

作者
Author:
万里云    时间: 2017-5-19 10:09
标题: GCC版本太新了确实不好
如题。在昨天的帖子(http://bbs.keinsci.com/forum.php ... 5906&extra=page%3D1)里提到如果软件太新,编译或运行时就可能出问题。现在把这个问题写下来,以后可能其他人也会碰到。
在主力服务器上编译软件,为了运行效率一般用Intel编译器。而自己电脑一来不适合干重活,二来装编译器太麻烦,因此一般用自带的GCC。比较保守的服务器用发行版如CentOS,现在还在用 GCC 4.x,而桌面用发行版(Ubuntu/Fedora)早已飙到了6.x。昨天在Fedora 25下编译BerkeleyGW一直报错,一开始是预处理错误,改了预处理选项之后是编译错误。查了好久才发现原来是GCC 6.x的预处理器cpp默认行为和4.x不一样了。


为了适应不同的硬件和软件环境,软件源码中会包含大量预处理指令。gfortran没有单独的预处理器,借用的是C语言预处理器cpp。问题是C语言的处理器对FORTRAN源码有些水土不服,比如//在C++中会被当作注释直接移除,而FORTRAN中是有效代码。所幸cpp有-C选项,可以保留所有注释。但问题也就出在这里。

对于GCC 4.x,cpp -C只会展开宏和处理一些条件编译指令,不会画蛇添足。但对于GCC 6.x,cpp -C会在源码中插入glibc的权责声明。这些声明用的是C风格的区块注释。Fortran源码中插入C的注释,自然就报错了。

翻遍GCC手册也没找到选项能禁用这一特性。最后想了个权宜之计:写一个python程序移除C风格注释;再修改Makefile,在预处理命令和编译命令之间新加一步操作。
#--------------------------- workarond for GCC > 4.x  -----------------------
#clang C-preprocessing treats files incorrectly if they have .F90 extension
ifeq ($(findstring clang,$(FCPP)),clang)
  f90_CPP = cp $(basename $<).f90 $(basename $<)_cp.F90; $(FCPP) $(INCLUDE) $(CPPOPT) $(basename $<)_cp.F90 > $(basename $<).p.f; $(REMOVE) $(basename $<)_cp.F90
else
  f90_CPP = $(FCPP) $(INCLUDE) $(CPPOPT) $< > $(basename $<).p.f; $(PREFIX)/rmcmt.py $(basename $<).p.f
endif
F90_CPP = $(FCPP) -P $(INCLUDE) $(CPPOPT) $< > $(basename $<).p.f; $(PREFIX)/rmcmt.py $(basename $<).p.f
#-----------------------------------------------------------------------------------


修改之后,编译通过。

后记:以后碰到新事物,先让别人去探探地雷

作者
Author:
ORCA_in_TCC    时间: 2017-5-19 10:38
借问一下BerkeleyGW怎么下载到的?
作者
Author:
万里云    时间: 2017-5-19 10:41
ORCA_in_TCC 发表于 2017-5-19 10:38
借问一下BerkeleyGW怎么下载到的?

www.berkeleygw.org可以下载。

要先注册。
作者
Author:
ORCA_in_TCC    时间: 2017-5-19 10:48
本帖最后由 ORCA_in_TCC 于 2017-5-19 10:49 编辑
万里云 发表于 2017-5-19 10:41
www.berkeleygw.org可以下载。

要先注册。

就是注册的时候有个问题老是通不过,不知道怎么回答,还请指教What does the G stand for in the name of this code? (only give the *second* word) [size=14.0096px]*

作者
Author:
万里云    时间: 2017-5-19 10:51
ORCA_in_TCC 发表于 2017-5-19 10:48
就是注册的时候有个问题老是通不过,不知道怎么回答,还请指教What does the G stand for in the name of ...

Green's Function,第二个词是Function。
作者
Author:
ORCA_in_TCC    时间: 2017-5-19 11:11
万里云 发表于 2017-5-19 10:51
Green's Function,第二个词是Function。

见笑了,我其实知道Green Function
作者
Author:
ggdh    时间: 2017-5-19 22:25
看到GW就头疼。PTSD发作了
作者
Author:
stecue    时间: 2017-5-20 05:34
ggdh 发表于 2017-5-19 22:25
看到GW就头疼。PTSD发作了

GW没搞过,NEGF弄过一段,感觉还行。




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3