关关难过关关过——编译edm
摘自《上海质子治疗装置注入器远程控制系统的构建》
EDM 和 MEDM安装哪个?
EDM 和 MEDM 是当前常见的 OPI 界面开发工具。 OPI 界面开发工具 EDM(Extensible Display Manager)是由美国橡树岭实验室(ORNL)主要承担开发的,通过 OPI 控制界面可以对 IOC 实时数据库里面的数据进行监测与控制。
基于图形用户界面 GUI(Graphical User Interface)的 MEDM(Motif Editor and Display Manager)也是一种图形化的 OPI 界面开发工具。早期在 EPICS 刚刚发展起来的时候,MEDM 广泛被世界各大实验室用来进行控制界面的开发。它的风格和功能和 EDM 大致一样,用其开发的控制系统在运行过程中也较为稳定,但它具有控件类型比较单一,且无法进行扩展的缺点。因现已经暂停了对 MEDM的开发,所有对于那些将要新建的加速器控制系统建议不要再使用 MEDM 进行控制界面的开发。
EDM 的安装,EDM 作为 EPICS 的一个扩展工具,在安装目录上有要求,需要在/usr/local/epics/extension/src 目录下创建目录 edm,然后把EDM的安装包解压到该文件夹下面,在安装之前也需要进行一些环境变量的配置,进入到/usr/local/epics/extensions/configure 目录下修改 RELEASE 文件,修改为EPICS_BASE=/usr/local/epics/base/,保存后退出。在编译之前,可以事先安装一些软件包以为在编译的时候报错进行多次编译,在 CentOS 下安装软件包的命令为 yum install packet,packet 为需要安装的软件包的包名,通常可能需要安装的是:gcc-c++、readline-devel、motif-devel、libXtst-devel 以及giflib-devel。还有需要的一些软件包根据在EDM编译时提示的错误再进行安装。EDM的编译,进入到/usr/local/epics/extension/src/edm 下,在终端运行 make,如无报错,则 EDM编译完成。
编译出现的错误
然后编译中出现错误如下图
然后查了一下,说是
const char*是不能直接赋值到char*的,这样编译都不能通过,理由:假如可以的话,
那么通过char*就可以修改const char指向的内容了,这是不允许的.
所以char*要另外开辟新的空间
怎么解决?
find -name 文件名 找到remFileOpen.cc
打开文件(vim ~/.vimrc,然后set nu 然后保存退出就可以永久显示行号辣,set nonu就是关闭行号)
我看到文件是这样的,
413 static int fileReadable (414 char *fname )//定义了一个字符型指针415 {416 417 FILE *f;418 419 char nameToCheck[255+1];//最大为256,不知道为啥要+1420 421 int result, len1, len2, remain;422 423 char *first, *last;424 425 // if filename is of the form name[parm].ext,426 // use name.ext in the "is readable check".427 first = index( (const char *) fname, (int) '[' );428 if ( first ) {429 last = rindex( (const char *) fname, (int) ']' );430 }// 如果括号里为真,则执行last// &位操作,&&逻辑与,条件满足则为真431 if ( first && last && ( first < last ) ) {// 这句是说,如果first,last存在,且first<last,则执行以下语句432 len1 = (long) first - (long) fname;//[的地址与fname的地址差433 if ( len1 > 255 ) len1 = 255;//char *strncpy(char *dest, const char *src, int n),//把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,//并返回被复制后的dest。434 strncpy( nameToCheck, fname, len1 );//这里len1小于255435 nameToCheck[len1] = 0;//这里取fname[前的字符串到nameToCheck,使得第len1-1个为0436 remain = 255 - len1;//[之后的字符串的位数//strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个//位 置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然//后返回计数器值(长度不包含'\0')。437 len2 = strlen( fname ) - (long) last + (long) fname - 1;438 if ( len2 > remain ) len2 = remain;439 strncat( nameToCheck, last+1, len2 );//函数原型:extern char *strcat(char *dest,char *src);//功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。440 nameToCheck[len1+len2] = 0;441 }//这个if里的作用就是把[]里的内容去掉,剩下的内容拼到一起442 else {443 444 strncpy( nameToCheck, fname, 255 );445 nameToCheck[255] = 0;446 447 // else if filename is of the form name.ext?params,448 // use name.ext in the "is readable check".449 first = index( (const char *) nameToCheck, (int) '?' );450 if ( first ) {451 *first = (char) 0;452 }453 454 // else use fname without any changes
根本看不懂这个函数是干啥的,于是开始百度。
首先,index函数和rindex函数
char * index(const char *s, int c);
char * rindex(const char *s, int c);
函数说明:index()用来找出参数s 字符串中第一个出现的参数c 地址,然后将该字符出现的地址返回。字符串结束字符(NULL)也视为字符串一部分。
返回值:如果找到指定的字符则返回该字符所在地址,否则返回0.
函数说明:rindex()用来找出参数s 字符串中最后一个出现的参数c 地址,然后将该字符出现的地址返回。字符串结束字符(NULL)也视为字符串一部分。
返回值:如果找到指定的字符则返回该字符所在的地址,否则返回0。
file *fp
FILE *fp//FILE是在C标准库中(stdio.h)中定义的一个结构体,通常用指针的方式保存在内存中,其内容描述了一个
//文件,或者说”流“更恰当。
//标准库中提供了通用的函数来读取和写入流,如fopen,fclose等等//FILE指针的使用在C中很广泛,如一些常用的输入/出流就是FILE*的类型,如//stdin、stdout、stderr等//当然,C++中用类进行了封装,更加具体和方便。//综上,FILE*fp就是声明了一个类型为FILE的,名为fp的指针(fp指file pointer, 文件指针),用于保存
//流信息
所以这里的问题就是,一开始定义的是char *fname,char nametocheck[],后面用的时候如first里
first= index((const char*)fname,(int)‘[’),把const char*的指针传给first,是char*,所以要把const char*转换为char*
怎么转呢?https://blog.csdn.net/hebbely/article/details/79577880
const char*转换为char*
#include "stdafx.h"
#include <iostream>int _tmain(intargc, _TCHAR* argv[])
{const char* constc = "Hello World!"; //初始化const char* 类型char* c = nullptr; //初始化char*类型c= const_cast<char*>(constc); //const char*类型转char*类型printf_s("%s\n", constc); //打印const char* 类型数据printf_s("%s\n", c); //打印char*类型数据return 0;
}
然后又出现缺gif_lib.h文件的错误
这里的.h文件是什么呢?C语言和C++语言的头文件
我们一般在.h类的头文件里面只放入函数声明,宏定义,函数原型。
而具体的实现在.cpp文件里面
比如你在<math.h>里面看到的数学函数都只有声明
具体实现在<math.cpp>里面
在编译的时候,编译器会自动加载和.h匹配的.CPP文件。
然后下载gif_lib.h文件,http://rpmfind.net/linux/rpm2html/search.php?query=/usr/include/gif_lib.h
用yum localinstall ****安装
安装之后有出现错误,zlibversion 没有声明,是在文件的开头没有调用zlib的头文件,加上#include <zlib.h> #include <zconf.h>就行了
在终端运行 make,如无报错,则 EDM编译完成。EDM 和 EPICS BASE 以及 EPICS Extensions 不一样,安装完之后还需要进行一些必要的配置才能正常使用。在终端上输入
cd /usr/local/epics/extensions/src/edm/setup,
接着输入
export HOST_ARCH=linux-x86_64,
再输入 source setup.sh。配置完上面一步之后,安装先前配置 EPICS BASE 的环境变量一样,打开.bashrc 文件。添加一下内容
EDMOBJECTS=/usr/local/epics/extensions/src/edm/setup
EDMHELPFILES=/usr/local/epics/extensions/src/edm/helpFiles
EDMBASE=/usr/local/epics/extensions/src/edm
EDMPVOBJECTS=/usr/local/epics/extensions/src/edm/setup
EDMFILES=/usr/local/epics/extensions/src/edm/setup
EDMDATAFILES=:~/.
EDMWEBBROWSER=firefox
配置完之后,正常情况下就可以使用 EDM 了
关关难过关关过——编译edm相关推荐
- 关关难过关关过——EPICS base 安装和利用makeBaseApp.pl建立一个IOC实例
参考了很多这个文章https://blog.csdn.net/u013963632/article/details/78138217?locationNum=8&fps=1 这里安装的版本是3 ...
- 游戏企业通关秘籍:华为云游戏全场景能力,开发+部署+运营“关关难过关关过”...
明敏 萧箫 发自 凹非寺 量子位 | 公众号 QbitAI 就说云技术在游戏圈有多火吧,今年ChinaJoy直接在云上办了. 这一次,ChinaJoy首次采取了电脑软件端作为载体,以线上交互游玩体验作 ...
- [C语言][数据存储+指针进阶]关关难过关关过 迈向光明之路 而我义无反顾 冲
//数据在内存的存储 //整形: char也归纳为了整形类型了 因为char字符对应的是ASCII值(相对应的具体数字) #include<stdio.h> int main()//调试 ...
- 关关难过关关过,华为云助力游戏厂商“闯关升级”
随着游戏产业的高速发展,游戏行业逐渐向精品化.IP 化.多样化的格局迈进,5G 的到来,更是让游戏厂商的发展迎来新契机. 这样的背景下,游戏厂商也面临许多困扰及挑战. 游戏即将开服,但源站难以承担巨大 ...
- 在sqli-liabs学习SQL注入之旅(第二十一关~第三十关)
二十一关 打开这一关,开屏暴击.报错的大致意思是时区没有设置好,我们进入报错的文件,在php代码中加入中国时区的代码即可: date_default_timezone_set("PRC&qu ...
- 光棍节程序员闯关秀(总共10关)
程序员闯关大挑战: https://1111.segmentfault.com/ 仓鼠演示7k7k.4399小游戏: http://cdn.abowman.com/widgets/hamster/ha ...
- 《光棍节程序员闯关秀》闯关攻略
https://1111.segmentfault.com<光棍节程序员闯关秀> 程序员们,欢迎来攻!!! 在之前的基础上,重新整理了一遍,之前才闯到第8 ...
- [hackinglab][CTF][脚本关][2020] hackinglab 脚本关 writeup
脚本关 1 key又又找不到了 关键字: 知识点: 步骤:点击提供的链接后,实际发生了两次跳转,key 在第一次跳转的网页中,key is : yougotit_script_now 脚本关 2 快速 ...
- 计算机游戏88关,天天象棋88关怎么过 闯关模式第88关图文攻略
天天象棋88关怎么过?闯关模式第88关图文攻略.天天象棋闯关模式第88关怎么过?天天象棋是一款上线的全新休闲类手游,这是一款玩家对战的象棋游戏,对于广大棋类游戏爱好者来说,绝对是很值得玩一玩的,游戏的 ...
最新文章
- 成功解决ERROR: Could not find a version that satisfies the requirement xgboost (from versions: none) ERR
- Spring boot的Webjars
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(二)
- 分布式系统原理 之5 日志技术
- 一起用ipython
- 微博 用户画像_“肖战”被抵制?Python爬虫揭秘肖战粉丝的人群画像
- mysql 中文乱码 或 问号
- 不能安装_监控安装不能忽视的要点
- 汤国安 ARCGIS地理信息系统空间分析实验教程
- 一个软件工程师的成长之路(二):回味经典组合 DOS + 五笔 + WPS + FOXBASE
- 用SyncToy进行两台服务器之间文件同步
- Webpower中国区正式推出邮件编辑利器——Smart editor!
- 《大数据时代》读后感,维克托
- 均匀分布、正态分布、二项分布、泊松分布、指数分布
- aws api gateway 使用阿里云的域名访问
- 元宇宙,小荷才露尖尖角
- Photoshop制作倒影字
- 在你的app里加入广告
- Linux下系统如何监控服务器硬件、操作系统、应用服务和业务
- 子墨庖丁-Gson的源码分析(1)-开篇
热门文章
- 微信公众号的留言功能
- S3C2440开发板裸机程序系列04—串口通信
- 【问题解决】正则表达式在线自动生成器
- iptables设置映射通过外网端口代理ssh登录内网服务器
- jsp输出金字塔_倒金字塔加码操作技巧及案例解析
- Excel怎么设置每页都打印标题行?
- python多张图叠加为一张_python实现多张图片拼接成大图
- MAME模拟器debug帮助文档汉化二(常规指令)
- 东北大学计算机考研专业842包括什么,2020年东北大学842《计算机专业基础》考研大纲...
- 英文简历技能证书撰写技巧汇总