热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

码农交流日常——我只能说:MDZZ(手动微笑)

本文属吐槽文,我只想说:对神论还蜜汁自信的怎么破?背景介绍上半年参与了一个水的不行的项目,总的架构如下:用C++作为实现语言在Windows下,用户界面以EXE的形式出现,其他模块

本文属吐槽文,我只想说:对神论还蜜汁自信的怎么破?

------------------------------背景介绍---------------------------------------

上半年参与了一个水的不行的项目,总的架构如下:

技术分享

用C++作为实现语言

在Windows下,用户界面以EXE的形式出现,其他模块以DLL的形式通过LoadLibrary加载

数据总控模块提供一套API给“自定义功能模块”使用,实现用户界面和功能模块的交互,自然,所有的自定义功能模块也都按照约定的接口实现,以便和数据总控模块的统一交互

分工好了以后,每个人负责各自的模块进行开发,我负责其中的若干个自定义功能模块。

很简单是吧?但是跟我写的标题有毛关系?对,的确暂时看不出来有毛关系,但是,我为了把我标题所指的事说清楚,这些是必须提到的背景材料,而且,我还得先引用一下:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms681914(v=vs.85).aspx

Types of Dynamic Linking

There are two methods for calling a function in a DLL:

    • In load-time dynamic linking, a module makes explicit calls to exported DLL functions as if they were local functions. This requires you to link the module with the import library for the DLL that contains the functions. An import library supplies the system with the information needed to load the DLL and locate the exported DLL functions when the application is loaded.
    • In run-time dynamic linking, a module uses the LoadLibrary or LoadLibraryEx function to load the DLL at run time. After the DLL is loaded, the module calls theGetProcAddress function to get the addresses of the exported DLL functions. The module calls the exported DLL functions using the function pointers returned byGetProcAddress. This eliminates the need for an import library.

简单说,上面一大堆意思就是,你要加载DLL有两种办法:

1. 编译阶段:通过给链接器提供你想加载的DLL对应的import library(这玩意儿是.LIB文件),这样在运行的时候系统会帮你自动加载你想要的DLL,你就不用写代码手动加载

2. 运行阶段:通过代码里调用LoadLibrary进行手动加载

任何一个上过幼儿园的码农都应该知道,C++的“编译阶段”和“运行阶段”是他妈的两个八杆子打不到一起的不同阶段吧?

------------------------------MDZZ---------------------------------------

最近各种测试,然后,在前几天,组里负责“数据总控模块”的人按照需求变更对该模块进行了变更(简称变更X),增加了新的接口(对于我负责的模块来说根本没影响,因为我的模块用不着新增的接口,所以只需要更新一下头文件,重新编译一下就可以,我连代码都不用改,所以我更新了一下头文件编译过了之后就直接git push了)

变更之后,又进行测试

今天组里负责测试的某人给我发个消息

TA:变更X之后,你的模块崩溃了

我:不会吧,上次提交测试不是好好的吗,变更X又跟我负责的模块没有直接关系,不就是增加了一个API么,我又没用到,我的模块连代码和输入数据都不用改啊,怎么可能是我的模块引起的崩溃?

【备注:然后我调试了一下,看了下出错:std::bad_alloc,再看了下调用堆栈,显示崩溃的地方在“数据总控模块”内部,因为我的模块没有做任何变更,包括输入的数据也没有任何变更,所以我当时估摸着问题应该跟“数据总控模块”的变更有关】

TA:反正崩了,其他人负责的自定义功能模块也有同样的崩溃情况

我:你看这调用堆栈,明明是在总控模块里面崩的,这太明显了吧,那我debug我自己的模块能解决什么问题,肯定要让总控模块那人去debug总控模块啊

【备注:我发了个截图给TA看调用堆栈】

技术分享

TA:但是他们其他的功能模块的崩溃问题都解决了,你也解决一下

我:他们怎么解决的?问题在什么地方?

TA:你把总控模块的DLL更新一下啊

【备注:我这里就纳闷了,我TM更不更新总控模块的DLL跟我的模块有没有BUG有鸡毛关系?难道总控模块有法轮大法?】

我:我当然更新了的啊,我刚才测试之前就更新了的啊,你自己看我git pull截图

技术分享

【备注:好了,准备好亮瞎眼

技术分享

【备注:我这里就看晕了,什么叫我的模块里有没有更新?我突然感觉到事态严峻(我要跟TA解释不清楚了):TA认为数据总控模块是“嵌入”到我的模块里才能运行的,然而实际上,这个项目里所有的模块都是相对独立的,并不存在谁嵌入谁的概念,只不过是数据在模块之间传递而已,所以,我就干脆顺着TA的问题问下去,要怎么更新?然后请看】

技术分享

【备注:前面已经提到过,编译的时候如果提供了import library(是一个LIB文件)的话,也可以的,然而,我们这个项目都是用LoadLibrary,根本没有用import library】

【备注:我很无奈,所以干脆就顺着TA的信仰继续问下去:】

技术分享

【备注:TA给我回个截图,我估计意思就是:你他妈更新这个DLL啊,嵌入到你的项目编译啊(然而,前面已经说过,我他妈早就更新了,而且,更不更新这玩意儿跟这个BUG没有鸡毛关系啊,大神!)】

技术分享

技术分享

【备注:我无奈,继续顺着TA的神论说下去,然后TA继续神论,我顿时无语,你TM确定我编译的时候要加载别的模块的DLL?你是说我编译的时候?你是说我编译的时候?你是说我编译的时候?你是说我编译的时候?】

技术分享

【备注:我感觉欲哭无泪,准备挣扎着给TA解释一下这个原理,顺便附上一张图怕自己说得不够清楚】

技术分享

技术分享

【备注:我继续顺着TA的神论说下去,然后TA给我来句这个,你们自己感受下神论大法的威力,TA居然认为直接把另一个模块的DLL扔到我的项目文件夹里就算TA信仰里的“嵌入”了!?你他妈不是在逗我?扔到文件夹中就行?扔到文件夹中就行?】

技术分享

【备注:然后我给TA展示了,即便按TA说的去改也没有卵用,结果TA直接来一句:那别人这么弄就解决了,你怎么解释?-我只能说:你家神论,大法好!我等凡人,参悟不了!】

技术分享

【备注:为了确认TA的意思,我重述了一遍:你确定是把那个模块的DLL放到我的模块的工程目录下就行?-TA蜜汁自信:是的】

技术分享

--------------------------------------------------------后记------------------------------------------------------

最后又折腾一会,BUG的原因找到了,头文件不同步造成的(这人也是神,明知道别人怎么解决的,他妈早说啊!我一开始就问了别人怎么解决的,别人怎么解决的,别人怎么解决的,绕那么远搞个鸡毛,呵呵)(某个头文件中间经过了若干次改动)(C++的pure virtual function的在头文件中的顺序必须一致,如果顺序不同也会导致调用出错,就是这个原因,懒得细说了,很简单的问题)

码农交流日常——我只能说:MDZZ(手动微笑)


推荐阅读
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
安安1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有