一般我们在自己写练习代码的时候很少会遇到一些链接问题,但是在工作中我们参与的项目往往是多个工程一起参与链接的,在平时学习的时候没有解决链接问题的经验。接下来会写下我在工作中遇到过的“无法找到解析符号”的问题是如何解决的。
工作中我一般用c++在win下用vs开发,这省掉了linux写makefile的时间(虽然很想学但是一直想不起来学~~~~),但是同时我认为给没有配置过工程的人带来问题,因为在linux下编译和链接的时候我们会自己给出编译和链接的参数。
话不多说,直接开始,省得我一会儿忘记了~~~
首先最常见的无法找到解析符号就是,启动工程调用动态库,但是动态库接口没有导出。一般我们在def文件中添加需要导出的接口或者直接在需要导出的接口和类上添加导出定义符号就可以了。说到这需要多说一嘴,如果两个dll有互相依赖的代码,一定要将这些依赖接触或者单一依赖,如果互相依赖的话,也会出现链接不过的问题。
其次,c代码无法直接调用c++代码,需要将c++代码以c的编译方式去编译extern "C"。
最近遇到过的最坑的无法找到解析符号的问题就是,一个接口的实现参数列表和定义参数列表不一样,并且这个接口还是用的C方式编译~~~~~这个问题的解决思路是这样的,首先我们确定了定义处是否需要导出,结果发现他们在各自的lib中,但是最后都会统一链接到启动工程上,所以应该没有问题。接着我们查看了这个接口有没有实现,通过vs看是有实现的(虽然到后来才看到这个实现虽然接口名字一样,但是参数不一样~~~)。最后我们才看出定义的接口的参数是int,但是实现的参数是long,更可笑的是,这种错误如果按照c++编译的话是会报错的,可是他就偏偏是extern “C”了~
所以这次总结起来的经验就是,一定要细心细心再细心~
补充一句,c++类中的static成员变量一定要在外部写上初始化代码,否则也链接不过,无法找到解析符号~
本博客以后都会以遇到的问题出发来分享解决问题中需要用到的一些知识和技巧,尽请期待~