开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 17694|回复: 45
收起左侧

使用C++(11.14)开发 易语言可静态编译支持库指南!!!

[复制链接]
结帖率:100% (1/1)
发表于 2018-3-3 21:33:21 | 显示全部楼层 |阅读模式   广东省中山市
本帖最后由 章鱼大大 于 2018-3-3 23:49 编辑

上一贴的地址:https://bbs.125.la/forum.php?mod=viewthread&tid=14131306

本来说周末写.结果加班.
新建project等常规操作我就不细讲了 一层楼发不完 未看到完结不要插楼 插楼的麻烦论坛管理直接删除
首先.强烈建议从此之后的所有支持库均由VS2015开发.最后使用2015编译器链接 至少5年内 可以不用换支持库
至于5年后.走一步看一步
VC6其实我也不推荐.虽然不会出MSVR的版本问题.因为编译之后可能会出现符号冲突
而且这玩意是1998年的 比论坛一些人年纪都大
这篇教程小白看会看不懂
新手C++会比较吃力
有问题可以进群问727137285(日后CGLIBFE的群) 或者 547525064(ELIB开发群)  我的ID是:MOV RAX 214D
(顺便打个电线杆小广告 接单接单 116 0320 547 价格美丽 基于windows一般都没问题)

我只说说一些重点 我重新创建了一个项目 Test_For_E
开发环境VS2015+win10 1607
测试环境易语言5.2+WIN7 SP1+上面帖子中提到的修复后的VS2015编译链接器
创建项目.选择win32,然后选DLL
QQ截图20180303204513.png
创建之后.dllmain.cpp不管他 暂时不要动
打开文件夹.复制elib过去.或者手动添加文件夹位置到C/C++属性页
QQ截图20180303204648.png
易语言支持库的开发必须有elib的头文件.里面基本上只是定义数据类型
elib文件版本不一样 也稍微有不同,至少我本人拿到的2个版本都有BUG 并且我其中一份还有其他人修改过的痕迹.帖子最后我会上传修正的elib.
你也可以不用 在e\sdk\cpp\elib中也有 不过可能需要自己改改BUG 其实也不能算是BUG 那个编译环境太老了 会出很多问题
然后新建E_Head.h头文件
在该头文件中.第一步先导入易语言数据类型 如果你用的是我给出的elib.那么只需要
#include "elib/fnshare.hpp"
否则的话看官方文档 各头文件用处不一样

这个头文件的作用就是用来定义各种易语言支持类型的
实际上 易语言动态库fne就是一个DLL.很逗吧?

在编译之后.直接把DLL改名为fne放到易语言lib里面都可以.但是反之不行 原因我之后会讲

然后加入动态库信息
QQ截图20180303204513.png
GUID可以随便填.推荐使用VS->TOOLS里面的createguid
或者在这里找 https://www.uuidgenerator.net/
版本号 支持库名称等
关于命令符分类 我也没搞明白 这种写法真的太Low了 有兴趣可以查查官方文档
新建实现文件 Test.cc
QQ截图20180303204513.png
所有函数必须使用extern "C"申明 除非你用的纯C开发并且使用C方式编译
所有函数返回值必须使用void 参数类型也不能变
PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf
这里大概讲解一下 我说完后你们再看看官方文档就懂了
PMDATA_INF是易语言自定义数据类型.内部使用了一个联合体,也就是说任意时刻只有一个类型是有效的
pRetData是返回值.也就是易语言调用之后的参数返回值
QQ截图20180303204513.png
也就是在动态库中进行规则约定,如果我的返回值是int类型.那么我就使用pRetData->m_int 同时在另一处规定返回值
这里我们让他返回整数型1.
nArgCount是参数个数
这也就是为什么易语言可以实现不限制参数个数的原因 这也是为什么易语言可以使用通用类型.但是通用类型却只能是易语言基本类型的原因
pArgInf这个才是易语言真正传进来的参数 数组结构 其实易语言返回值也可以做成多个返回值.不知道为什么没有弄
pArgInf的使用基本和pRetData是一样的
比如使用第一个参数 是pArgInf[0].m_int
那么第二个 就是pArgInf[1].m_int
后面的类型自选
test我设置了3个参数.分别是整数型 文本型 和子程序指针
然后全部转const char* 最后吧内容弹出来
OK 在写一个test2
test只设置一个参数.返回值为文本型
接下来开始设置一些函数信息.我们现在只是定义声明了函数,易语言那边需要特殊操作才能正常获取





点评

楼下的智力有问题?   广东省中山市  发表于 2018-3-30 12:25
发错地方了,这里是易语言   湖南省邵阳市  发表于 2018-3-30 09:47

评分

参与人数 1好评 +1 精币 +1 收起 理由
xxdahai + 1 + 1 那么问题来了,大神能带我飞吗

查看全部评分


本帖被以下淘专辑推荐:

结帖率:100% (1/1)
 楼主| 发表于 2018-3-3 21:39:31 | 显示全部楼层   广东省中山市
本帖最后由 章鱼大大 于 2018-3-3 21:46 编辑

之前我们说到了在动态库中约定规则 参数 返回值等现在就是要告诉易语言的时候.编译动态库之后.易语言会获取到这部分信息.静态编译也需要这部分信息的支持
QQ截图20180303204513.png
数组名自定义即可每一个数组都是一条参数信息
名称和描述不用讲.最后会显示到易语言里面去
图像这两个我也没用过 有兴趣的可以试试
接下来是返回值类型.参考一楼那张图
第一个参数是整数 所以使用SDT_INT 这个也是易语言自定义类型 所以我们第一个参数使用了pArgInf[0].m_int



回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2018-3-3 21:51:44 | 显示全部楼层   广东省中山市
函数的参数搞定了.接下来是函数的信息 返回值 参数个数等约定
QQ截图20180303204513.png
关于ExecuteCommand和CommandNames 照抄就行了 至于为什么看官方文档 把所有函数名称写进去就行了
这两个数组中的每个函数 位置必须一一对应.他并不是用英文名称去查找函数.而是用位置索引!
Commands用于定义函数帮助信息 这些都需要用逗号隔开
只讲几个重要的 名称描述啥的一看就知道是干嘛的了
参数个数 也就是该函数需要的参数个数.这里一定要填对.填错了我也不知道会发生啥
然后是参数类型的具体定义 也就是上一楼中我们定义的数组


回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2018-3-3 22:04:20 | 显示全部楼层   广东省中山市
本帖最后由 章鱼大大 于 2018-3-3 23:15 编辑

关于__E_STATIC_LIB
官方文档中提到的宏而已可以删除 不影响正常编译
在编译静态库的时候 并不需要参数信息参数个数等信息
易语言通过查找fne内的信息 去匹配static lib 这点其实有点蠢 一旦两个版本不一致 会发生未知后果 而且没有任何警告
QQ截图20180303204513.png
照抄这个函数 函数名自定义就可以了
前两个一般不用动
最后一个需要注意
NL_GET_DEPENDENT_LIBS 这个是静态库依赖的Lib列表
在动态库写入之后.静态编译的时候 会添加到命令行中(我目测.猜的)
当然也可以不管他.直接在link.ini中写入.
QQ截图20180303204513.png
这里一般照抄就行
唯一要改的就是下面的函数
改成上面那个就OK
怕你们看不见 特意补图
QQ截图20180303204513.png
接下来申明导出函数
QQ截图20180303204513.png
之前那个帖子中说需要.def 其实不需要 只需要申明导出就行
回到最初的那个问题
为什么易语言编译出来的DLL不行?原因就在这里了
在整个fne编译之后 只有一个导出函数
getnewinf会把你定义的所有信息全部返回.包括什么支持库名字啊 描述啊 函数啊 参数啊 返回值 都在里面
其实还是蛮神奇的 只需要导出这么一个函数即可如果易语言同样导出这个函数 并且导出信息 其实易语言编译个DLL出来 改下名也能用!
放入lib之后 添加支持库的时候 易语言会去遍历每一个fne的PE函数导出表 看看有没有叫做getnewinf的函数 有就获取信息 显示出来
OK 到这一步.整个支持库编写就完成了 接下来是配置



回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2018-3-3 22:07:16 | 显示全部楼层   广东省中山市
本帖最后由 章鱼大大 于 2018-3-3 23:17 编辑

首先 修改字符集 是debug版本 我这里吧debug当做fne release当做lib用 QQ截图20180303204513.png
VS默认是Unicode 改过来就行 编译平台什么的其实无所谓 VC6能不能用未知
但是你要是想支持XP3下运行 就在编译器选择XP
配置类型.dll 目标文件名可以改成.fne 或者编译后手动改 随便你的 QQ截图20180303220637.png
这里默认就行 如果全程序优化打开了 就关闭它.否则会造成编译出错
QQ截图20180303204513.png
代码生成一般debug默认MDd 这里我改成mtd 因为MD是动态编译 需要安装VS运行库 如果你需要发布fne 别人又没有装运行库 那么就无法使用 所以我选择MT静态编译
fne的设置就这么多 编译拿过去试一下




回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2018-3-3 22:15:02 | 显示全部楼层   广东省中山市
本帖最后由 章鱼大大 于 2018-3-3 22:38 编辑

QQ截图20180303204513.png
编译通过
拿过去试试.DLL改下名字 改fne 丢到e/lib中 QQ截图20180303204513.png
OJ8K 读出来了
QQ截图20180303204513.png
试试调用
QQ截图20180303204513.png
很完美
QQ截图20180303204513.png
这是使用C++11标准的std::thread库 C++11标准由C++委员会制定 从boost中选取 windows平台上编译器由微软实现
现在知道我之前的那个帖子有多么凶残了吧?
OK 接下来 静态库
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2018-3-3 22:48:12 | 显示全部楼层   广东省中山市
本帖最后由 章鱼大大 于 2018-3-3 23:33 编辑

配置我直接选的release
QQ截图20180303204513.png
修改配置类型为静态库
目标文件名加上_static 只有这样易语言才识别
也可以不加 编译后手动改
改一下字符集
QQ截图20180303204513.png
一定要关闭全程序优化!
QQ截图20180303204513.png
一定要选择MT静态编译 否则你的静态库没有任何意义!
然后编译生成 其他一般都默认就可以
QQ截图20180303204513.png
放入e\static_lib中
然后开始静态编译
QQ截图20180303204513.png        不好意思 我是盗版狗...
QQ截图20180303204513.png
很完美
其次是关于上一贴的补充说明
编译显示krnel.lib符号未找到的一定要修改这里
QQ截图20180303204513.png
OK 教程到此结束



回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2018-3-3 22:48:45 | 显示全部楼层   广东省中山市
本帖最后由 章鱼大大 于 2018-3-3 23:49 编辑

此楼作为补充楼层
有任何修改 错误.或者补充 都会在这层中编辑觉得牛逼的话点一下关注(听众) 后续我会开源很多支持库出来 第一个就是线程库 从此告别模块和官方支持库渣渣封装
15年我就搜过易语言支持库开发教程 没有 这可能是除了官方文档的唯一一个支持库开发教程了
-----------------------------------------------
补充1:关于写窗口的问题
我修改过后的elib还能不能写窗口我不太清楚 导入的头文件不太一样 我没兴趣搞那个
推荐各位别造那种轮子...
-----------------------------------------------
整个项目打包包括fne lib 还有elib都在这里了
https://pan.baidu.com/s/1d29T4y




回复 支持 反对

使用道具 举报

结帖率:86% (12/14)
发表于 2018-3-4 13:50:24 | 显示全部楼层   四川省成都市
感谢分享!稍后下载
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2018-3-4 14:34:52 | 显示全部楼层   河南省郑州市
前排支持 章鱼大大 这简直就是对易语言的一次大更新!~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表