易语言做数值运算的精确度怎么样,和C++比怎么样?求大神指点迷津 英文。

大家觉得易语言怎么样、_程序员吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:78,975贴子:
大家觉得易语言怎么样、收藏
本人菜鸟、对编程很感兴趣、但是不懂英语!请各位大神指点、易语言好用么跟c++比起来那个好、
程序员培训,美国上市公司,15年培训经验,帮助40万学员成功就业,7万家合作企业.达内java课程全新升级,打造引领行业的java课程,立即申请免费试听.
易语言和c语言比无异于 夏利比保时捷
易语言不错哦。做外挂神器
易语言为何适合初学者?过程是这样的。易语言——VB——C——JAVA。易语言会让你迅速理解编程过程。当易语言支持库无法满足你的要求时,你会想到VB,当VB面向对象有点模糊时,你会想到JAVA。易语言不是孤立的语言,需要各种组件支撑,而要摸透那些组件,你就必须学习其他语言。从而逐步踏进编程大门。
易语言是编程入门的好语言,可以这么说,学了2年的c++,刚接触易语言,有种相见恨晚的感觉,可以让你更容易掌握一些c++比较难实现的功能第一、易语言纯汉语编程,把一些底层的API函数封装起来了。比如说MessageBox,c++中MessageBox("",0,"",);函数需要3个参数,而易语言直接
信息框(“内容”,0,“标题”);创建文件在c++中,需要调用底层API,利用Windows API中的CreateFile函数。其中的参数多达6、7个,而文件指针,文件句柄,函数的返回值如何接收都是比较困难的事情,而易语言直接
创建文件(“文件路径”,“文件名”);第二、易语言没有c++那么多的规则,c++有头文件包含,函数需要先声明后实现,以及比较复杂的宏定义和内联函数,而在易语言这些全部抛弃了。第三、做个键盘钩子,c++需要调用API函数SetWindowsHookEx(),而此函数的返回值为一个钩子句柄,而易语言只要一个 键盘监控();函数即可搞定。第四、c++中的消息机制,多线程,清栈方式,都是入门时学起来很困难的事情。易语言在这个方面大大的简化了。第五、易语言也有面向对象的机制,函数是锁定窗体的,这样更易于编写代码。第六、有的时候觉得c++很傻比,学c++的人更傻B,但是易语言只适合程序的快速入门,但是对于长期发展易语言毕竟有很多局限性,比如易语言的编译器不精简,c++经过好几代人的努力肯定在功能方面做到了最好。中文编程需要我们的努力
不写外挂学什么易语言
易语言与C++相当于陨石对比宇宙吧
我发现很多人喜欢拿着易语言与C、C++来比较,有什么可比性。就好比拿着一粒沙子与地球比大小。我不是看低易语言,我只是想说两者真没有可比性,差距太大了!!
其实你不用问大家怎么样,自己去招聘网站搜下这两个语言的职位就行了。我刚才在北京51job搜了下。C++,大概搜到了2400条,最早的是8月20日的Java,大概搜到了12147条,最早的是8月20日的易语言,对不起,没有找到符合您条件的职位。
易语言漏洞太多,只适合做一些小外挂什么的,不适合做上市软件
来火星时代学习程序开发,强大美术资源,多年游戏教学实力,20000家合作企业,毕业=就业,火星时代程序开发,业界精英一对一辅导,参与游戏实训项目,工作经验不再是零.
没人用的语言学了有什么用
几乎就是玩具。。。
Java大法好,开元免费跨平台
程序员英语不需要多好,买一本计算机英语背背,然后再开始学习,会比较好。易语言,终归还是比不过C/C++ C# JAVA PHP他们的
我在学易语言快学完了打算学完学c
一群S-B程序员!易语言是一款不错的中文编程语言其特点在于开发简捷、快速、高效、易学、易理解、可视化(尤其是快速高效,一般用其他语言半年才能开发出来的软件用户易语言2-3个月就能搞定,而且BUG相对少跟多),局限在于发展晚、慢、不成熟,做一些办公软件百兆左右的软件优势大大的,做一些上G的软件就不行了会感觉运行有点慢。计算机语言的发展本来就是越来越方便越来越简单越来越大众化,等到第四代第五代语言发展起来,也许说一句话就直接实现一个功能甚至创建一个软件模板(到那时程序员这个行业就尼玛还会有人?),而易语言的发展正是遵循了这一点,只不过没钱宣传,没钱继续开发,而国内大部分喜欢装B的程序员,又自认为牛B哄哄(总想着从洋媚外,不想着开发自己国家的东西)不愿意承认而已。拿手机做个比喻,易语言、C++、Java等都属于第三代语言就像1500块的联想手机和5000块的苹果同属于智能机一样,只不过和大多数语言刚开发出来那会一样,易语言现在只是雏形并不像其他语言那么成熟。1500块钱的联想手机也能实现5000块钱苹果手机的功能,只不过在运行大程序时没有苹果手机流畅,也就是说易语言也能实现其他语言能实现的功能只不过大的程序运行有点慢,再一个原因就是易语言没钱宣传、没钱搞开发又受到大多数同行的歧视,发展肯定缓慢。
学易语言都是垃圾 不解释
至于编程,一段话写不完,一篇文章写不完,一本书写不完。我不是大师,不是高手,只是多了一点认识。就简单说点嘴皮子扯淡的事。也不想多扯,看到19楼,你们觉得有必要扯?19楼能给我解释个易语言下的“启动窗口_鼠标位置被移动”这个事件函数是怎么形成的吗?参数是怎么来的?你能搞清楚吗?他不是汉语封装出来的吧?且不谈是怎么封装的?你能用好它吗?另外,没有人否定吴涛,也没有人否定易。相反这是国人的骄傲。现在告诉你一些正确的认识吧。1、每一种语言都是有局限的。都有优势和弱势。2、但若单纯讨论功能强大,这个星球还真的只有C和C++,不用解释的问题,这是其他高级语言的祖师爷。放句粗话:人家的爹是微软。我想知道,现在谁敢说他的公司能搞垮微软?不是从洋媚外,而是形式所迫,美国佬70年代开始普及电脑,我们玩这玩意儿真没人家厉害。3、其次使用哪种语言不是关键,实现结果才是关键。哪种语言好还真得看要求。4、汇编是一类语言;c是一类语言;易和basic(也就是VB)是一类语言;c++是一类语言;vb.net和JAVA/C#是一类语言。这些语言各有所长,当然,易是中国的VB,VB是大多数英语国家的VB,易比起VB还是不行的。我肯定19楼根本不懂啥叫过程式语言和基于对象语言和完全面向对象语言。5、以前说程序=算法+数据结构,现在说程序=对象+消息机制。两种说法都正确。扯了点没用的废话,也没啥意义。你用过了,你学过了,你长进了,你不满足了,你就知道差异了。每个人的认知不一样。去相互扯淡也没有意义。
咱先得研究明白,C/C++/java等统称为编程语言,易语言不属于编程语言行列,易语言是一个大型文本替换工具,将中文代码转换成VB代码,效率极其底下,用易语言的都是大学以下的中学生,或者统称为没做过编程的人……
易语言太垃圾了,编程和英语完全是两码事,虽然表面上看上去都是用26个字母在拼写,但实际上编程的语法和英语的语法也完全没关系,命令也就是那么几个,跟英语单词比起来实在是少太多了,国内大多数的编程教材也都是中文的,所以英语不好也能学习编程,q,我也是这个专业的,欢迎交流
吴涛大法好,易语言成就了多少小白,可以说易语言使中国的编程事业最少发展了5年,但是作者却没赚多少钱吧。精通技术的就不通商业,有技术的人多,赚到钱的人还是少的
看一个语言有没有前途,首先看它能解决什么问题,说功能之类没多大用。c语言呢能够较为准确反映硬件操作,设计的很底层,编写系统程序这是他的优势,第一个通用型语言。现在语言分为两种一种C,一种Clike.Python,没那么多技巧。编写速度快,写程序非常高效。C++适合系统开发,引擎开发,这个能解决很多问题,用的很多。JAVA,汇编就不用说了。如果说易语言,你就不用说他有什么功能,其他语言也有,你要说它中文编程,那么你可以看看我上面说的那些语言的发明者,他们用的母语都不是英语,所以如果你不会英语,你还是别混IT了~
楼上正解,会易语言大部分都是中学生,然后随手一个软件说我会编程而当你会编程后就会发现随手一写就是个易语言易语言的原理:复杂的文本替换,替换为VB
其实楼主只是想水个经验
可以当业余爱好玩,那玩意除了做界面方便也没啥优势了。
你拿它和c比?你太看得起易语言了!没有看不起易语言的意思,只是目前确实不成熟,漏洞太明显…但是却很佩服当初开发易语言的人,非常好的思路!希望能完善能接轨世界!
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或易语言(9)
#include &lib2.h& #include &lang.h& #include &fnshare.h& #include &fnshare.cpp&
3.文件结尾处加入自己的代码
1) 定义LIB_INFO
这段代码是定义模块信息的,只在动态模块中使用,所以加入宏__E_STATIC_LIB来定义。
也就是说,如果是静态库那么这段代码就不会被编译。
静态库编译的时候只需在项目设置的C++ -& 预处理器 中加入 __E_STATIC_LIB 即可。
#ifndef __E_STATIC_LIB static LIB_INFO LibInfo = { /* { 库格式号, GUID串号, 主版本号, 次版本号, 构建版本号, 系统主版本号, 系统次版本号, 核心库主版本号, 核心库次版本号, 支持库名, 支持库语言, 支持库描述, 支持库状态, 作者姓名, 邮政编码, 通信地址, 电话号码, 传真号码, 电子邮箱, 主页地址, 其它信息, 类型数量, 类型指针, 类别数量, 命令类别, 命令总数, 命令指针, 命令入口, 附加功能, 功能描述, 消息指针, 超级模板, 模板描述, 常量数量, 常量指针, 外部文件} */ LIB_FORMAT_VER, _T(LIB_GUID_STR), LIB_MajorVersion, LIB_MinorVersion, LIB_BuildNumber, LIB_SysMajorVer, LIB_SysMinorVer, LIB_KrnlLibMajorVer, LIB_KrnlLibMinorVer, _T(LIB_NAME_STR), __GBK_LANG_VER, _WT(LIB_DESCRIPTION_STR), _LIB_OS(__OS_WIN),
_WT(LIB_Author), _WT(LIB_ZipCode), _WT(LIB_Address), _WT(LIB_Phone), _WT(LIB_Fax), _WT(LIB_Email), _WT(LIB_HomePage), _WT(LIB_Other),
sizeof(DataTypes)/sizeof(DataTypes[0]), DataTypes, LIB_TYPE_COUNT, _WT(LIB_TYPE_STR), sizeof(Commands)/sizeof(Commands[0]), Commands, ExecuteCommand,
NULL, NULL, mylib_ProcessNotifyLib, NULL, NULL, sizeof(Consts)/sizeof(Consts[0]), Consts, NULL }; PLIB_INFO WINAPI GetNewInf() { return (&LibInfo); }; #endif
注意: GetNewInf 是易语言动态库 (dll) 唯一必须导出的函数。所以需要在.def文件(mylib.def)里加入以下&
EXPORTS &&&&; 此处可以是显式导出 &&&&GetNewInf
接下来我们看看LIB_INFO 是如何定义的。具体含义可以参阅开发文档。这里根据库的不同,需要修改的地方有
1- LIB_ 这样的变量是我们另外定义的,可以定义在mylib.h中如下:
#ifndef __E_STATIC_LIB #define LIB_GUID_STR &0000& /*GUID串: {0-000000}, 必须使用guidgen.exe生成*/
#define LIB_MajorVersion 1 /*库主版本号*/ #define LIB_MinorVersion 1 /*库次版本号*/ #define LIB_BuildNumber
/*构建版本号*/ #define LIB_SysMajorVer 3 /*系统主版本号*/ #define LIB_SysMinorVer 0 /*系统次版本号*/ #define LIB_KrnlLibMajorVer 3 /*核心库主版本号*/ #define LIB_KrnlLibMinorVer 0 /*核心库次版本号*/ #define LIB_NAME_STR &支持库名称& /*支持库名*/ #define LIB_DESCRIPTION_STR &支持库功能描述& /*功能描述*/ #define LIB_Author &作者名称& /*作者名称*/ #define LIB_ZipCode &邮政编码& /*邮政编码*/ #define LIB_Address &通信地址& /*通信地址*/ #define LIB_Phone &电话号码& /*电话号码*/ #define LIB_Fax &传真号码& /*传真号码*/ #define LIB_Email &电子邮箱& /*电子邮箱*/ #define LIB_HomePage &主页地址& /*主页地址*/ #define LIB_Other &其它信息& /*其它信息*/ #define LIB_TYPE_COUNT 1 /*命令分类数量*/ #define LIB_TYPE_STR &0000基本命令\0&&\0& /*命令分类*/ #endif
2- DataTypes 是库中定义的数据类型表,类型的数量可以自动由sizeof(DataTypes)/sizeof(DataTypes[0]) 计算。
Commands 函数命令信息表,ExecuteCommand 命令指针表,Consts 常量表 都是一样的。这些都是库中希望定义的成员。
如果不需要就在数量上写0,变量处替换成NULL即可。
3- mylib_ProcessNotifyLib 是库中需要定义的消息指针。必须定义在宏的外面以便静态和动态库都能调用
EXTERN_C INT WINAPI mylib_ProcessNotifyLib(INT nMsg, DWORD dwParam1, DWORD dwParam2)
{ #ifndef __E_STATIC_LIB &&if(nMsg == NL_GET_CMD_FUNC_NAMES) // 返回所有命令实现函数的的函数名称数组(char*[]), 支持静态编译的动态库必须处理
&& return (INT)CommandN &&else if(nMsg == NL_GET_NOTIFY_LIB_FUNC_NAME) // 返回处理系统通知的函数名称(PFN_NOTIFY_LIB函数名称), 支持静态编译的动态库必须处理
&& return (INT)&mylib_ProcessNotifyLib&; &&else if(nMsg == NL_GET_DEPENDENT_LIBS) return (INT)NULL; &&&&&&&&&&&&&&&&// 返回静态库所依赖的其它静态库文件名列表(格式为\0分隔的文本,结尾两个\0), 支持静态编译的动态库必须处理 &&&&&&&&&&&&&&&&// kernel32.lib user32.lib gdi32.lib 等常用的系统库不需要放在此列表中 &&&&&&&&&&&&&&&&// 返回NULL或NR_ERR表示不指定依赖文件&& #endif return ProcessNotifyLib(nMsg, dwParam1, dwParam2); };
本函数的作用是接收来自易语言IDE或者运行时环境的通知。并且在编译的时候起到在静态库和动态库之间通讯的目的。
接下来我们就可以定义库中需要使用的 函数,类型,常量 了。
这些都定义在 mylib_ProcessNotifyLib 函数的前面,且都定义在宏中,如下:
#ifndef __E_STATIC_LIB
因为这些只需包含在动态模块里,不需要静态中定义。 函数的具体实现过程需要定义在宏的外面,具体方式会在下文中讲到。
2) 定义常量 Consts
#ifndef __E_STATIC_LIB LIB_CONST_INFO Consts[] = { /* { 中文名称, 英文名称, 常量布局, 常量等级(LVL_), 参数类型(CT_), 文本内容, 数值内容 } */ { _WT(&常量_ZERO&), _WT(&ZERO&), NULL, LVL_SIMPLE, CT_NUM, NULL, 0 },//数值常量 { _WT(&常量_TEST&), _WT(&TEST&), NULL, LVL_HIGH, CT_TEXT, &TEST&, NULL }//文本常量 }; #endif
常量等级有: LVL_SIMPLE&&&&&&&&&&1&&&&&&&&// 初级
&&&& &&&&&&&&&&&&&&&& LVL_SECONDARY&&&&&& 2&&&&&&&&// 中级
&&&&&&&&&&&&&&&&&&&&&&LVL_HIGH&&&&&&&&&&&&3&&&&&&&&// 高级
参数类型有: CT_NUM&&&&&&&&&&&& 1&&&&// sample: 3.1415926
&&&&&&&&&&&&&&&&&&&&&&CT_BOOL&&&&&&&&&&&&2&&&&// sample: 1
&&&&&&&&&&&&&&&&&&&&&&CT_TEXT&&&&&&&&&&&&3&&&&// sample: &abc&
文本内容是CT_TEXT用,数值内容是CT_NUM和CT_BOOL用。
3) 定义数据类型 DataTypes
用作提供支持库自定义数据类型,包含窗口单元。一个简单的例子:
#ifndef __E_STATIC_LIB INT DatatypeCommandIndexs[] = { 2 }; static LIB_DATA_TYPE_INFO DataTypes[] = { /* { 中文名称, 英文名称, 数据描述, 索引数量, 命令索引, 对象状态, 图标索引, 事件数量, 事件指针, 属性数量, 属性指针, 界面指针, 元素数量, 元素指针 } */
{ _WT(&数据类型命令&), _WT(&DatatypeCommand&), _WT(&测试数据类型命令。&), sizeof(DatatypeCommandIndexs)/sizeof(DatatypeCommandIndexs[0]), DatatypeCommandIndexs, NULL, 0, 0, NULL, 0, NULL, NULL, 0, NULL }
关于LIB_DATA_TYPE_INFO的解释 以及 窗口型数据的定义 都可参见开发文档中 &m_pDataType成员说明&和&数据类型说明&。
4) 定义函数,ExecuteCommand,Commands
函数书写规范是
EXTERN_C void mylib_函数名(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf)
函数的实现都需要定义在宏的外面以便静态和动态库都能使用,但ExecuteCommand,Commands则只需定义在宏的里面供动态库使用。
pRetData 输出数据指针。当对应CMD_INFO中m_dtRetType为_SDT_NULL(即定义无返回值)时,pRetData无效;
iArgCount 函数参数个数
pArgInf 函数参数指针
#ifndef __E_STATIC_LIB PFN_EXECUTE_CMD ExecuteCommand[] = { mylib_函数名 // 所有需要库中调用的函数都列在这里,用逗号隔开 }; static const char* const CommandNames[] = { &mylib_函数名& // 所有需要库中调用的函数名都写在这里,用逗号隔开 }; ARG_INFO CommandArgs[] = { /* { 参数名称, 参数描述, 图像索引, 图像数量, 参数类型(参见SDT_), 默认数值, 参数类别(参见AS_) } */ { _WT(&参数1&), _WT(&本命令的参数1&), 0, 0, SDT_INT, NULL, NULL } //函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开
}; static CMD_INFO Commands[]= { /* { 中文名称, 英文名称, 对象描述, 所属类别(-1是数据类型的方法), 命令状态(CT_), 返回类型(SDT_), 此值保留, 对象等级(LVL_), 图像索引, 图像数量, 参数个数, 参数信息 } */
{ _WT(&函数名&), _WT(&英文函数名&), _WT(&函数功能描述&), 1, NULL, SDT_BOOL, 0, LVL_SIMPLE, 0, 0, 1, CommandArgs },//基本命令
a. 函数名前的前缀 mylib_ 是以后静态库中使用的。要求必须是动态库项目名称mylib的全小写形式 mylib_。
b. 只需对库中需要调出的函数加前缀处理,其他函数不需要这样书写。
c. 如果程序内部需要调用这个函数,只需使用函数名即可,无须前缀。
d. 参数类型如果是 AS_RECEIVE_VAR或AS_RECEIVE_VAR_ARRAY或AS_RECEIVE_VAR_OR_ARRAY 则参数必须是变量。
// AS_DEFAULT_VALUE_IS_EMPTY& 参数可空且默认值为空
// AS_HAS_DEFAULT_VALUE 参数有默认值 且不可空
// AS_RECEIVE_VAR 参数必须是非数组变量
// AS_RECEIVE_VAR_OR_ARRAY 参数是数组或非数组变量
// AS_RECEIVE_ARRAY_DATA 参数是数组数据
// AS_RECEIVE_ALL_TYPE_DATA 参数是数组或非数组数据
以上参数除了前两个互斥,其他都可以相加使用,以便具有多个性质。
例如 AS_DEFAULT_VALUE_IS_EMPTY + AS_RECEIVE_VAR 表示参数可空,并且只能是变量。
e. 所属类别是在库中函数归类的子目录,这些子目录的名字在 LIB_INFO的LIB_TYPE_STR 字串定义。-1是数据类型,1第一类,2第二类...
sdk中关于数据类型的定义如下:&
&&&&#define&&&&&&&&_SDT_NULL&&&&&&&&0&&&&&&&&&& // 空白数据类型
&&&&#define&&&&&&&&_SDT_ALL&&&&&&&& MAKELONG (MAKEWORD (0, 0), 0x8000)&&// 通用型
&&&&&&&&/*&&仅用于支持库命令定义其参数或返回值的数据类型,当用于定义库命令参数时,
&&&&&&&&_SDT_ALL可以匹配所有数据类型(数组类型必须符合要求)。*/
&&&&#define&&&&&&&&SDT_BYTE&&&&&&&& MAKELONG (MAKEWORD (1, 1), 0x8000)&&// 字节
&&&&#define&&&&&&&&SDT_SHORT&&&&&&&&MAKELONG (MAKEWORD (1, 2), 0x8000)&&// 短整数
&&&&#define&&&&&&&&SDT_INT&&&&&&&&&&MAKELONG (MAKEWORD (1, 3), 0x8000)&&// 整数
&&&&#define&&&&&&&&SDT_INT64&&&&&&&&MAKELONG (MAKEWORD (1, 4), 0x8000)&&// 长整数
&&&&#define&&&&&&&&SDT_FLOAT&&&&&&&&MAKELONG (MAKEWORD (1, 5), 0x8000)&&// 小数
&&&&#define&&&&&&&&SDT_DOUBLE&&&&&& MAKELONG (MAKEWORD (1, 6), 0x8000)&&// 双精度小数
&&&&#define&&&&&&&&SDT_BOOL&&&&&&&& MAKELONG (MAKEWORD (2, 0), 0x8000)&&// 逻辑
&&&&#define&&&&&&&&SDT_DATE_TIME&&&&MAKELONG (MAKEWORD (3, 0), 0x8000)&&// 日期时间
&&&&#define&&&&&&&&SDT_TEXT&&&&&&&& MAKELONG (MAKEWORD (4, 0), 0x8000)&&// 文本
&&&&#define&&&&&&&&SDT_BIN&&&&&&&&&&MAKELONG (MAKEWORD (5, 0), 0x8000)&&// 字节集
&&&&#define&&&&&&&&SDT_SUB_PTR&&&&&&MAKELONG (MAKEWORD (6, 0), 0x8000)&&// 记录用户易语言子程序的代码地址
这些数据类型在函数定义参数时调用。
动态库制作完成后,编译会生成mylib.dll文件。把.dll改成.fne 拷贝到易语言的lib文件目录下即可使用。或者也可以修改项目属性,把编译输出文件后缀从.dll修改成.fne,并输出在易语言的lib目录中。 这样编译完后即可直接在易语言里调用。
II. 静态库的制作
如果你已经按照上面的方法书写代码并制作好了动态库,接着就可以方便的再此基础上制作静态库了。方法有两种
第一种是生成一个静态库项目编译
第二种是在原来的动态库项目上修改成静态库项目
方法一)生成静态库项目
具体步骤如下:
1. 在项目解决方案上鼠标右键 -& 添加 -〉新建项目 名称输入 mylib_static (就是动态库项目名称加后缀_static)。
VS的向导里设置程序类型 为&静态库&。去掉预编译头的钩。点击完成。
2. 选择动态库项目文件列表中的所有文件,ctrl+C 复制 在新的mylib_static项目 中ctrl+V拷贝过来。
3. 配置mylib_static 项目属性, 以release模式为例,打开release配置。修改配置如下:
+ 常规 -& 字符集 设置为多字节字符集
+ 常规 -& 全程序优化 设成 无全程序优化 (这里很重要否则会影响 resym.exe 的工作)
+ C++选项卡 -& 附加包含目录 填入D:\E51\sdk\cpp\ELib
+ C++ -& 预处理器 -& 预处理定义 添加宏 __E_STATIC_LIB
+ 生成事件 -& 生成后事件 -& 命令行 填入 D:\E51\sdk\tools\resym.exe all infile=$(TargetPath) outfile=$(TargetPath)
resym.exe 是用来修改lib库连接符号的,以解决连接时符号冲突的问题。程序位置设成你自己sdk所在位置。
设置后选择release编译即可。 编译完后会生成静态库mylib_static.lib文件。
方法二)修改动态库配置为静态库配置
具体步骤如下:
打开动态库项目mylib的项目管理,点击配置管理器,mylib的配置处下拉菜单选择 &新建&, 添入名称 release_static, &从此处复制设置&选择release
创建release_static后开始修改配置如下:
+ 常规 -& 配置类型 设置为 静态库(.lib)
+ 常规 -& 全程序优化 设成 无全程序优化
+ C++ -& 预处理器 -& 预处理定义 删除宏 _USRDLL 添加宏 __E_STATIC_LIB
+ C++ -& 预编译头 -& 选择不使用预编译头
+ 管理员 -& 常规 -& 输出文件 改为 $(OutDir)\$(ProjectName)_static.lib
+ 生成事件 -& 生成后事件 -& 命令行 填入你 D:\E51\sdk\tools\resym.exe all infile=$(TargetPath) outfile=$(TargetPath)
设置修改完成后,选择release_static项目编译
静态库的使用需要动态库支持。我们需要把动态库的fne放在易语言的lib目录下 和 静态库的lib放在static_lib目录下。这样才能静态编译。编译出来的结果将可以脱离任何非系统支持库独立运行。
关于运行时库的配置:
个人比较喜欢把release模式设置成&在静态库中使用 MFC&并且使用&多线程(/MT)&。
VS向导生成的MFC项目(exe,dll,lib)一般都默认设置为 &在共享 DLL 中使用 MFC& 并使用 &多线程 DLL (/MD)&
这样编译出来的COFF文件尺寸小,但程序运行时必须依赖MFC的dll库。
把设置修改成&在静态库中使用 MFC&并且使用&多线程(/MT)& 就可以脱离MFC的dll库运行。这样即使在没有安装Visual C++ Runtime library的机器上也能正常运行。这种模式也就是VC++的&静态编译&。编译后的文件尺寸会稍大些。技术上和易语言的静态编译是一样的。
具体设置方法
+ 常规 -& MFC的使用 选择 &在静态库中使用 MFC&,如果库中没有用到MFC的类函数和类资源 那么也可以选择&使用标准 Windows 库&
+ C++ -& 代码生成 -& 运行时库 选择 &多线程(/MT)&
很多VC软件开发者就是因为这里没有设置好,结果程序在其他机器上一运行就跳出缺少运行时库的错误提示。所以本人建议最好养成习惯,使用静态编译模式配置项目。
////////////////////////////////////
下面给出一个简单的支持库的例子:
我们希望库里面有一个函数,且不需要自定义数据类型和常量。
函数中文名称是 &两数相加&,英文名称是&myadd&, 希望调用格式是。
〈小数型〉 两数相加 (小数型 参数1,小数型 参数2)
该函数在库中所属函数分类是&基本运算&
源代码如下:
+ mylib.cpp文件内容
#include &stdafx.h& #include &mylib.h& #include &lib2.h& #include &lang.h& #include &fnshare.h& #include &fnshare.cpp& ////////////////////////////////////////////// // 模块内容 ////////////////////////////////////////////// //定义函数 EXTERN_C void mylib_myadd(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf)
{ pRetData-&m_float = pArgInf[0].m_float + pArgInf[1].m_ }; ///////////////////////////////////////////// #ifndef __E_STATIC_LIB PFN_EXECUTE_CMD ExecuteCommand[] = { mylib_myadd // 所有需要库中调用的函数都列在这里,用逗号隔开 }; static const char* const CommandNames[] = { &mylib_myadd& // 所有需要库中调用的函数名都写在这里,用逗号隔开 }; ARG_INFO CommandArgs[] = { /* { 参数名称, 参数描述, 图像索引, 图像数量, 参数类型(参见SDT_), 默认数值, 参数类别(参见AS_) } */ { _WT(&参数1&), _WT(&加数1,小数型&), 0, 0, SDT_FLOAT, NULL, NULL }, //函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开
{ _WT(&参数2&), _WT(&加数2,小数型&), 0, 0, SDT_FLOAT, NULL, NULL } //函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开
}; static CMD_INFO Commands[]= { /* { 中文名称, 英文名称, 对象描述, 所属类别(-1是数据类型的方法), 命令状态(CT_), 返回类型(SDT_), 此值保留, 对象等级(LVL_), 图像索引, 图像数量, 参数个数, 参数信息 } */
{ _WT(&两数相加&), _WT(&myadd&), _WT(&两个小数相加求和,返回小数&), 1, NULL, SDT_FLOAT, 0, LVL_SIMPLE, 0, 0, 2, CommandArgs },//基本命令
}; #endif ////////////////////////////////////////////// EXTERN_C INT WINAPI mylib_ProcessNotifyLib(INT nMsg, DWORD dwParam1, DWORD dwParam2)
{ #ifndef __E_STATIC_LIB &&if(nMsg == NL_GET_CMD_FUNC_NAMES) && return (INT)CommandN &&else if(nMsg == NL_GET_NOTIFY_LIB_FUNC_NAME) && return (INT)&mylib_ProcessNotifyLib&; &&else if(nMsg == NL_GET_DEPENDENT_LIBS) && return (INT)NULL; #endif return ProcessNotifyLib(nMsg, dwParam1, dwParam2); }; #ifndef __E_STATIC_LIB static LIB_INFO LibInfo = { /* { 库格式号, GUID串号, 主版本号, 次版本号, 构建版本号, 系统主版本号, 系统次版本号, 核心库主版本号, 核心库次版本号, 支持库名, 支持库语言, 支持库描述, 支持库状态, 作者姓名, 邮政编码, 通信地址, 电话号码, 传真号码, 电子邮箱, 主页地址, 其它信息, 类型数量, 类型指针, 类别数量, 命令类别, 命令总数, 命令指针, 命令入口, 附加功能, 功能描述, 消息指针, 超级模板, 模板描述, 常量数量, 常量指针, 外部文件} */ LIB_FORMAT_VER, _T(LIB_GUID_STR), LIB_MajorVersion, LIB_MinorVersion, LIB_BuildNumber, LIB_SysMajorVer, LIB_SysMinorVer, LIB_KrnlLibMajorVer, LIB_KrnlLibMinorVer, _T(LIB_NAME_STR), __GBK_LANG_VER, _WT(LIB_DESCRIPTION_STR), _LIB_OS(__OS_WIN),
_WT(LIB_Author), _WT(LIB_ZipCode), _WT(LIB_Address), _WT(LIB_Phone), _WT(LIB_Fax), _WT(LIB_Email), _WT(LIB_HomePage), _WT(LIB_Other),
0, NULL, LIB_TYPE_COUNT, _WT(LIB_TYPE_STR), sizeof(Commands)/sizeof(Commands[0]), Commands, ExecuteCommand,
NULL, NULL, mylib_ProcessNotifyLib, NULL, NULL, 0, NULL, NULL }; PLIB_INFO WINAPI GetNewInf() { return (&LibInfo); }; #endif
+ mylib.h的文件里加入
#ifndef __E_STATIC_LIB #define LIB_GUID_STR &9D13FF9D0E1240aaBE1B78E6B32B855F& /*GUID串: {9D13FF9D-0E12-40aa-BE1B-78E6B32B855F}, 必须使用guidgen.exe生成*/
#define LIB_MajorVersion 1 /*库主版本号*/ #define LIB_MinorVersion 1 /*库次版本号*/ #define LIB_BuildNumber
/*构建版本号*/ #define LIB_SysMajorVer 3 /*系统主版本号*/ #define LIB_SysMinorVer 0 /*系统次版本号*/ #define LIB_KrnlLibMajorVer 3 /*核心库主版本号*/ #define LIB_KrnlLibMinorVer 0 /*核心库次版本号*/ #define LIB_NAME_STR &我的易库& /*支持库名*/ #define LIB_DESCRIPTION_STR &测试易库制作& /*功能描述*/ #define LIB_Author &kaien& /*作者名称*/ #define LIB_ZipCode && /*邮政编码*/ #define LIB_Address && /*通信地址*/ #define LIB_Phone && /*电话号码*/ #define LIB_Fax && /*传真号码*/ #define LIB_Email &[email][/email]& /*电子邮箱*/ #define LIB_HomePage && /*主页地址*/ #define LIB_Other &祝大家使用愉快& /*其它信息*/ #define LIB_TYPE_COUNT 1 /*命令分类数量*/ #define LIB_TYPE_STR &0000基本运算\0&&\0& /*命令分类*/ #endif
Q: 编译静态库没问题,但是易语言调用静态编译时出现
error LNK2001: unresolved external symbol ___security_cookie
error LNK2001: unresolved external symbol @__security_check_cookie@4
A: 关掉“缓冲区安全检测”重新编译静态库。 具体方法:
静态库编译项目设置里,C++ -& 代码生成 -& 缓冲区安全检测 设置为 否 重新编译静态库即可。
Q: 如果你的静态库在静态编译的时候需要其他静态库的支持 怎么办?
A: 例如: 你的静态库A.lib里使用了其他静态库B.lib和C.lib的函数。
那么你需要修改A源码里的函数mylib_ProcessNotifyLib的
&&else if(nMsg == NL_GET_DEPENDENT_LIBS)
&& return (INT)&B.lib\0&&C.lib\0&&\0&;
&&// 返回静态库所依赖的其它静态库文件名列表(格式为\0分隔的文本,结尾两个\0)
相应的编译动态库时,需要把 B.C.lib 加入到项目属性的
连接器 -& 输入 -& 附加依赖项 里。也就是使用静态库编译dll和exe的方法。
Q: 如何调试你的动态库?
A: VC上调试你的动态库和调试dll是一样的。具体步骤是:
1. debug模式编译出动态库fne/fnr文件,放到lib目录下
2. 易语言写个测试程序,里面调用这个动态库某个需要调试的函数
3. 动态编译这个测试程序,加入是test.exe
4. VC中在需要调试的调试函数开头处设断点,然后F5运行调试
5. 选择test.exe文件,执行。一旦测试程序运行到这个函数,就会断下来,我们就可以调试了。
只要动态库运行正常了,静态库因为用的是同一套代码,所以也没问题。
Q: 待续...
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6718次
排名:千里之外}

我要回帖

更多关于 天谕指点迷津仙姑在哪 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信