静态库与动态库的跨编译器兼容

由于当前项目维护的代码需要支持多个编译器,最近突然好奇为什么不直接在高版本的 VS 中直接使用低版本生成的库呢?起初以为是不可行,但是后面从理论上想了一下,感觉对于动态库来说应该可行,低版本生成的 DLL 依赖低版本的 C++ 运行时,高版本生成的可执行程序依赖高版本的 C++ 运行时,按照这样的设定应该没有任何问题才对。

举个例子,VS2013 生成了动态库库 A.lib 和 A.dll,VS2015 中使用了 A.lib 生成 B.exe,让我们来看下最终的依赖情况(下面 C++ 运行时库的名字以 msvc 来代替):

  • B.exe 依赖于 A.dll 和 msvc2015.dll
  • A.dll 依赖于 msvc2013.dll ...
阅读全文

Call convention & Name mangling

标题只是为了满足强迫症,文中对于 Call convention 还是使用中文翻译的调用约定,但 Name mangling 因为不知道怎么翻译好,就保持吧。

之前同学在聊面试的时候提到被问过调用约定(Call convention)相关的问题,突然想起来自己虽然知道这个东西影响的是方法调用(比如参数如何传递、调用栈清理等),但是并不记得每个类型的调用约定存在的作用以及具体内容,于是查了一下。

调用约定(Call convention)

调用约定规定了一个方法在被调用的时候需要遵循的一些内容:

  1. 参数如何传递,包括使用寄存器还是堆栈或是混合、从左到右压栈还是从右到左压栈。
  2. 调用栈最终由谁负责恢复?调用者(Caller)或被调用者(Callee)。
  3. 方法最终在链接时使用的符号名。
  4. 更多...

显然,调用约定是 ABI(Application binary interface) 层面的东西,而且这玩意有很多类型,历史原因在于以前提供机器的那波厂商没有顺带提供操作系统和编译器,而是把这两块交给了市场,于是各家自己玩自己的,弄出来各种自己的标准,所以 ABI 兼容就别想了。虽然也有如 ...

阅读全文

2016小结

今天是2016的倒数第二天了,过的真的是好快。昨天早上实验室要开年终总结会,所以前天晚上早早爬上了床,趴着想自己这一年到底做了啥,然而却想不起太多,稍微想到一点什么,仔细回想后发现并没有什么后续,懊恼一番后继续想。最后得出的结论是,又白费了一年,连个带成果的年终小结都写不出来,真是尴尬。没办法,就按时间线写流水吧。

年前及过年的就不说了,也没啥印象了,一向觉得过年没太大意思,尤其是要见各种认不出来的亲戚,我是真的记不住有些亲戚该如何称呼,每年遇到这样的情况我都觉得自己是又一次进入到去年今日的循环中,大致都能猜出剧本的下一步会是周围的人来不断给你提示,最终在大家帮助下,猜出称呼,收获红包,结束。令我抓狂的地方在于,由于亲戚众多,这个过程往往要在同一天上演多次。过年最喜欢的还是在家里和家人吃火锅,吃完饭后唠唠嗑,然后边玩游戏边等春晚节目,现在脑子里还有这样的画面:在房间里玩着游戏,听到电视上某个小品演员的声音后光着脚放下任务啪嗒啪嗒跑出来,看完后顺手拿瓶饮料又啪嗒啪嗒跑回去接着做任务。

年后并没有享受学生该有的假期,早早地回来实习,感觉自己的寒暑假生涯早在大三就没了,衰。回来过了没几天,一条消息宣告我又单身了2333,挺崩溃的,但好在我现在还能比较平静地写下这些。难受的感觉实在写不出来,只记得自己那些天完全控制不住泪腺,晚上在操场上一圈圈散心的时候莫名其妙就会哭。不过现在想起来,真的很感谢她愿意帮着渡过这段缓冲期,谢谢 ...

阅读全文