使用gfortran在fortran中编译共享对象时,我收到以下三个类似的错误消息:
我在源代码的文件夹中make HX.so
。这以前工作得很好。我怀疑这是一个链接问题或(?)编译问题。
当我编译为可执行文件(下面的makefile标志)
时,不会发生此问题 在make HX.so:期间输出
/var/folders/g0/dlhhqpcj18x3d99m9htxjn6w0000gn/T//cc5UxkcK.s:81:suffix or operands invalid for `movq'
/var/folders/g0/dlhhqpcj18x3d99m9htxjn6w0000gn/T//cc5UxkcK.s:213:suffix or operands invalid for `movq'
/var/folders/g0/dlhhqpcj18x3d99m9htxjn6w0000gn/T//cc5UxkcK.s:269:suffix or operands invalid for `movq'
/var/folders/g0/dlhhqpcj18x3d99m9htxjn6w0000gn/T//cc5UxkcK.s:350:suffix or operands invalid for `movq'
make: *** [CARBON.o] Error 1
我在这里查看了很多关于上述错误消息的帖子,但是我没有得到他们提出的任何解决方案。请参阅下面我已经尝试过的内容。
在完成所有读数后,我有一种预感,即编译时找不到gcc编译器存在的一些问题。但我不明白为什么。我安装了自制软件和Macports,并了解这可能搞砸了路径名。以前我在安装netcdf库和与其相关的其他库时遇到了问题,但是当使用macports安装它们并将-I和-L中的路径指向macports位置时,暂时编译好了。然后我不确定究竟发生了什么变化.. 1)添加了一些我不记得$ PATH而不是./bashrc_profile的东西? 2)也许最近的mac更新已经做了一些事情...... ??
故障排除:
1)来自[this] {error with gcc 5 for varargs function: suffix or operands invalid for `movq')我假设Xcode brew冲突。
所以我更新了Xcode。
2)从this我假设gcc安装之间存在冲突 我在各个地方发现了几个gcc版本。 (不知道为什么这与我的gfortran copiler有什么关系,直到我阅读this编辑:我现在明白这两个编译器都会给出相同的错误信息,因此我在网上发现的一些线程对我没用对于我的问题,而是转移我(第(2)次和下一次(3)尝试)。
3)我还将这些Xcode -gcc安装的路径添加到我的bash_profile中,希望必须使用它们。
echo $PATH
收益/usr/local/opt/gettext/bin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/Users/../anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/opt/X11/bin:/Applications/Xcode.app/Contents/Developer/usr/bin
在我的/.bash_profile中它也是sais:# MacPorts Installer addition on 2018-02-21_at_11:21:44: adding an appropriate PATH variable for use with MacPorts.
..来源bash_profile,同样的错误。
仍然认为编译器的路径一定存在问题我尝试了这两件事(请记住,如果这看起来像一个有趣的解决方案,我不知道我在做什么,这些尝试可能会有让我远离我的具体问题(?))
4) 我尝试了symlinking到更新的Xcode gcc:
sudo ln -s /Applications/Xcode.app/Contents/Developer/usr/bin/gcc /usr/bin/g++
Password:
ln: /usr/bin/g++: Operation not permitted
5)我尝试将gfortran移动到/ usr / bin:
sudo mv /usr/local/bin/gfortran /usr/bin/
Password:
mv: rename /usr/local/bin/gfortran to /usr/bin/gfortran: Operation not permitted
扩展版本信息:
做
$ which gfortran
返回/usr/local/bin/gfortran
$ which gcc
和$which g++
返回/usr/bin/gcc or g++
$gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$gfortran --version
GNU Fortran (GCC) 6.1.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ld -v
@(#)PROGRAM:ld PROJECT:ld64-274.2
configured to support archs: i386 x86_64 x86_64h armv6 armv7 armv7s armv7m armv7k arm64 (tvOS)
LTO support using: LLVM version 5.0.1
$as -v
Apple Inc version cctools-895, GNU assembler version 1.38
Xcode版本9.2
我使用的是Mac OS 10.13.3
可能还有其他有用信息:
我正在使用netcdf动态库,我在makefile中指出,因为macport将它们放在导致链接错误的地方。我担心编译器也在寻找gcc吗?但实际上,我对这一主题的知识不足以做出任何假设。
我的makefile的一部分:
F90 = gfortran
FFLAGS = -O2 -fpic -g -I/opt/local/include/ -fdefault-real-8 # -I/opt/local/include/ -check -traceback # double-precision now run in Fortran , -fpic for creating shared object file
LDFLAGS = -L/opt/local/lib/ -lnetcdff -shared #-shared, for creating a shared object file
编辑:
1)使用gfortran使用testfile进行正常编译工作正常: test.f90:
PROGRAM test
IMPLICIT NONE
integer :: A
A =2
WRITE(*,*)A
END PROGRAM test
$gfortran test.f90 -o test
,编译好
$./test
返回2
2)编译为.exe 在另一个分支中,我将所有内容保存为可执行文件;编译所有工作正常。唯一改变的是(一些声明,分配和主要不是子程序,而是主程序)。
.exe的makefile标志有:
F90 = gfortran
FFLAGS = -O2 -g -I/opt/local/include/ #-check -traceback # double-precision now run in Fortran , -fpic for creating shared object file
LDFLAGS = -L/opt/local/lib/ -lnetcdff #-shared, for creating a shared object file
答案 0 :(得分:2)
根据@roygvib的建议,我做了brew doctor
。它呈现了错误消息,我在终端返回的指令brew指导下修复(这包括执行brew missing
然后按照所有指令获取缺少的库/链接现有库)
完全专注于基于自制软件的安装,我删除了macports库。
移动了macports库:
sudo mv /opt/local ~/macports
检查make HX.so并在编译时找不到netcdf-libraries:
f951: Warning: Nonexistent include directory ‘-I/opt/local/include/’ [-Wmissing-include-dirs]
然后,我使用自制软件安装了netcdf库: brew install netcdf --with-fortran
$ brew info netcdf
netcdf: stable 4.6.0 (bottled)
Libraries and data formats for array-oriented scientific data
https://www.unidata.ucar.edu/software/netcdf
/usr/local/Cellar/netcdf/4.6.0 (84 files, 6MB) *
Poured from bottle on 2018-03-08 at 07:28:02
From: https://github.com/Homebrew/homebrew-core/blob/master/Formul /netcdf.rb
==> Dependencies
Build: cmake ✘
Required: hdf5 ✔, gcc ✔
我将makefile中的路径更改为指向自制的netcdf库
-I/usr/local/Cellar/netcdf/4.6.0/include
-L/usr/local/Cellar/netcdf/4.6.0/lib
使HX.so不再提供错误消息,并且.so在被调用时运行正常。
即使现在已修复,我仍然不明白的是,当(成功)编译为可执行文件时,在makefile中使用相同的-I和-L路径,我能够成功运行它。这个问题似乎与我使用共享netcdf库与静态库的方式有关。
答案 1 :(得分:0)
我的Mac OS(10.13.2)上有brew,macport,Xcode和许多不干净的东西。
编译简单的c程序时遇到了这个问题:
Accfermi $ gcc acc_fermi_jg.c -o acc
/var/folders/w2/p1_q71lx3ll42j4h4lq28ljr0000gn/T//ccCCVWTZ.s:15:suffix or operands invalid for `movq'
/var/folders/w2/p1_q71lx3ll42j4h4lq28ljr0000gn/T//ccCCVWTZ.s:16:suffix or operands invalid for `movq'
/var/folders/w2/p1_q71lx3ll42j4h4lq28ljr0000gn/T//ccCCVWTZ.s:52:suffix or operands invalid for `movq'
/var/folders/w2/p1_q71lx3ll42j4h4lq28ljr0000gn/T//ccCCVWTZ.s:53:suffix or operands invalid for `movq'
etc...
我使用brew doctor
sudo mv /opt/local ~/macports
echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.bash_profil
brew prune
这完全解决了我的问题。