通常我们会用gcc编译动态链接库给用户使用,而用户则可能使用g++。这样就会有一个问题,链接的时候经常找不到函数。如何解决这个问题呢,我们先看以下为什么找不到。 大家知道,c++是支持函数重载。也就是说,相同名字的函数可以在c++中定义多次,只需要返回值或者函数参数不同即可。 我们分别用g++和gcc编译同一个文件看看其生成的二进制文件。 [crayon-68033cdb66f74588788108/] 使用gcc编译后 [crayon-68033cdb66f77223370153/] 使用g++编译后 [crayon-68033cdb66f78761006881/] 很明显。对于同一个源文件,同一个函数,使用不同的编译器下编译出了不同的结果。gcc编译后还是ScardOpen,而g++编译后变成了_Z9SCardOpenv。而函数的实现则是完全一样的。 因为g++是支持函数名重载的。所以单靠函数名是不能区分不同的函数的,随意它在函数名字的前后都加了一些内容。这就是链接使用不同的编译器编译出来的动态链接库无法找到函数的原因。 如何解决呢。因为C++是在C之后出现的。所以C++可以通过一些选项兼容C语言。我们可以在我们提供给用户的头文件里加入extern “C” {} 解决问题 比如: [crayon-68033cdb66f79135884872/] g++发现有extern “C”包含的东西会以C的方式链接,而定义了__cpluspluc则表示如果使用g++编译则定义extern “C”
Posted by
kaoru