Ubuntu 24.04 LTS 安装GAMIT

Ubuntu 24.04 LTS 安装GAMIT

熟悉GAMIT的朋友应该都知道,在GAMIT官网有一则Known Issue:不要在Ubuntu 24.04上安装GAMIT

MIT的几位佬测试,换了多个版本的gcc/gfortran编译都不成功,报错:

bash 复制代码
ar: creating libsofa.a

*** Now type 'make test' to install the library and run tests ***

cp libsofa.a ../../../../libsofa.a
Segmentation fault (core dumped)
Failure in make_gamit -- install_software terminated

哥们头铁,我就想在Ubuntu 24.04上装GAMIT,有没有办法呢?有的兄弟,有的。

错误定位

这个错误发生在make_gamit这个脚本里,发生这个错误之前的操作就是用make编译了libsofa这个库。而我们可以发现,在对应目录下的命令行里执行这个命令屁事没有。

bash 复制代码
make FC=gfortran

那么问题很明确了,就是这个版本的csh执行到这里内存管理出问题了...

卸载csh

ok,按照GAMIT作者的测试结论,Ubuntu 25.10并没有问题,那么我们自己编译一个最新版的csh替换掉就行了。在此之前,先把csh卸掉

bash 复制代码
sudo apt purge csh tcsh -y

编译tcsh

首先从官网下载tcsh的源码,当前最新的是6.24.10

bash 复制代码
wget http://ftp.funet.fi/pub/mirrors/ftp.astron.com/pub/tcsh/tcsh-6.24.10.tar.gz

然后利用configure生成makefile,以默认设置编译即可。

bash 复制代码
./configure
make -j$(nproc)
sudo make install

编译好的tcsh放在/usr/local/bin下,建立一个csh的链接

bash 复制代码
sudo ln -s /usr/local/bin/tcsh /usr/bin/csh

测试一下,没啥问题,命令行只会显示一个>

bash 复制代码
>

🆗

GAMIT配置修改

参考官网Known Issues中的建议,将libraries/Makefile.configgamit/solve/Makefile.generic中的FFLAGS添加-fallow-argument-mismatch

GAMIT代码修改

由于GAMIT采用的C语言标准较老,kf/plot/中调用了X11的部分出现了重定义的问题。因此,需要对头文件x1000.h进行更改,把全局变量添加extern

c 复制代码
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <stdio.h>
/* #include <math.h> */
#include "x1000.icon"
#define WINFRAC 2      /* x1k window fraction of largest window (1/WINFRAC)*/
#define MAXSTRLEN 256
  /* maximum length of a label */

extern Display     *display;
extern int          screen;
extern GC           gc;
extern XGCValues    gcv;
extern XFontStruct *font_info;
extern XEvent       report;
extern XSizeHints   size_hints;
extern Window       win;
extern Pixmap       icon_pixmap ;
extern Pixmap       clip_mask ;
extern XSetWindowAttributes setwinattr;
extern unsigned long valuemask;

/* Definitions for defining the plotting area and the size of this 
   area */

extern float xvl, xvr, xvb, xvt  ; 
      /* Virtual corrdinates of the cornors of the
         area for plot (left, right, bottom, top */
extern float xwl, xwr, xwb, xwt; 
      /* World coordinates of the cornors of the
         virtual area */
extern int Window_width; /* current width of window in pixels */
extern int Window_height; /* current height of window in pixels */
extern int curr_charsize[2];  /* current character size for actual font used 
                          width and height (pixels) */
extern int usr_charsize    ;  /* User character size in pixels */
extern int Curx;           /* current x coord of cursor (viewport scale) */
extern int Cury;           /* current y coord of cursor (viewport scale) */

/* Current font style and info */

extern float jcenter;   /* Defines the centering to be used 0-1       
                    for left through right justification */
extern float jheight;  /* Justification in height for strings 
                   (0-1.0 for bottom to top justifcation */
extern int jor_tan;     /* Defines orientation of baseline of the text
                    strings given as tan of angle */
extern int jzse;        /* Current character size as specified by user
                    which is different from current font size 
                   (pixels) */
extern int jdash;      /* Current dash pattern (init to solid line)*/
extern int jwidth;      /* Current width of lines (init to 1 pixel)*/

extern int jclip ;     /* Set to one to enable clipping, 0 for no clipping*/

extern char font[MAXSTRLEN] ; /* Name of current font to be used */

然后在check_window.c内定义相关变量:

c 复制代码
#include "x1000.h"
/* global variables */
Display     *display;
int          screen;
GC           gc;
XGCValues    gcv;
XFontStruct *font_info = NULL;
XEvent       report;
XSizeHints   size_hints;
Window       win;
Pixmap       icon_pixmap;
Pixmap       clip_mask;
XSetWindowAttributes setwinattr;
unsigned long valuemask = 0;

float xvl, xvr, xvb, xvt;
float xwl, xwr, xwb, xwt;
int Window_width;
int Window_height;
int curr_charsize[2];
int usr_charsize = 0;
int Curx, Cury;

float jcenter;
float jheight;
int jor_tan;
int jzse;
int jdash;
int jwidth;
int jclip;
char font[MAXSTRLEN];
/*以下代码不变*/

然后正常执行./install_software即可。

GAMIT 不处理GPS L2C的小bug

现在编译没啥问题了,之前还发现了一个小bug:20250901这个更新里面并没有读取GPS的L2C的观测值,在算项目数据时出现了这样的情况,GPS双频观测值是L1C和L2C,用LC_AUTCLN模式死活算不出来...

参考文献:

GAMIT解算北斗三号新频点(B1C、B2a)数据

改代码的位置在gamit/lib/sel_obtyp.f第67行 附近,添加载波相位观测值

fortran 复制代码
        if( gnsslf.eq.'G5' ) then         
           call fill_obtypx(2,'L5 ',nobtyp,rxobtyp,iobtypx) 
           call fill_obtypx(2,'L5X',nobtyp,rxobtyp,iobtypx) 
           call fill_obtypx(2,'L5I',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(2,'L5Q',nobtyp,rxobtyp,iobtypx)
        else
           call fill_obtypx(2,'LC ',nobtyp,rxobtyp,iobtypx) 
           call fill_obtypx(2,'L2 ',nobtyp,rxobtyp,iobtypx) 
c ADD
           call fill_obtypx(2,'L2C',nobtyp,rxobtyp,iobtypx) 
           call fill_obtypx(2,'L2X',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(2,'L2L',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(2,'L2Y',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(2,'L2S',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(2,'L2W',nobtyp,rxobtyp,iobtypx)
        endif

和第98行附近,添加伪距观测值

FORTRAN 复制代码
        if( gnsslf.eq.'G5' ) then   
           call fill_obtypx(4,'C5 ',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(4,'C5X',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(4,'C5I',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(4,'C5Q',nobtyp,rxobtyp,iobtypx)
        else   ! Default selection
           call fill_obtypx(4,'CC ',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(4,'C2 ',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(4,'P2 ',nobtyp,rxobtyp,iobtypx)
c ADD
           call fill_obtypx(4,'C2C',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(4,'C2X',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(4,'C2L',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(4,'C2Y',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(4,'C2S',nobtyp,rxobtyp,iobtypx)
           call fill_obtypx(4,'C2W',nobtyp,rxobtyp,iobtypx) 

然后重新编译即可。

相关推荐
新手村领路人2 小时前
ubuntu24.04安装todesk远程工具
ubuntu·todesk·远程工具
namekong82 小时前
ubuntu 通过下面几种方式查看系统 重启时间/开机时间:
linux·运维·ubuntu
爱奥尼欧2 小时前
【Linux】网络部分——网络基础(协议与网络传输)
linux·网络·arm开发
strongwyy2 小时前
esp32墨水屏学习3
学习
_dindong3 小时前
Linux系统编程:线程概念
linux·运维·笔记·学习
雪饼android之路4 小时前
【Android】 android suspend/resume总结(3)
android·linux
老黄编程4 小时前
ubuntu如何查看一个内核模块被什么模块依赖(内核模块信息常用命令)?
linux·运维·ubuntu
贝塔实验室4 小时前
LDPC码的概念
科技·学习·程序人生·算法·学习方法·程序员创富·改行学it
知北游天4 小时前
Linux网络:使用UDP实现网络通信(服务端&&客户端)
linux·网络·udp