• VC++静态连接库


    1静态连接库    1

    1.1 同名函数的选择    1

    1.2 模块合并    2

    1.2.1 模块替换    4

    1.3 内联函数    4

    1静态连接库

    静态连接库与动态连接库一样,都可以实现C++代码复用。与动态连接库相比,静态连接库最大的缺陷在于:如果某个相同的函数名在多个静态库里重复出现,那么连接这个函数时选择哪个库就显得尤为重要。稍有不慎,就可能出现大问题。不过,静态库也有它的优势:可以只生成单独的一个 exe 执行文件,发布起来会比较方便。

    1.1 同名函数的选择

    以下图为例,假定有两个静态库Lib1Lib2,这两个库里均包含了函数func。如果客户程序Test用到了func函数,那么连接Test程序时编译器到底选择哪个库里的func呢?

    经过VC++6.0的测试发现:这与Lib1Lib2的连接顺序有关:先连接Lib1,就使用Lib1中的func;同样的,先连接Lib2,就使用Lib2中的func

    假如Test用到了funcfunc2,连接库的顺序是 Lib1Lib2。会出现什么情况呢?先连接Lib1,因为func函数的缘故,模块1.obj将参与连接。连接Lib2时,func的连接将继续使用1.objfunc2的连接则必须使用模块2.obj。但是1.obj2.objfunc的冲突,编译器(VC++6.0)会提示如下错误:

    Lib2.lib(2.obj) : error LNK2005: "void __cdecl func(void)" (?func@@YAXXZ) already defined in Lib1.lib(1.obj)

    就是说:连接器在使用2.obj时,发现了与1.obj的同名函数func,连接无法继续下去,报错终止连接过程。

    此时,该如何处理呢?答案就是改变连接库的顺序。下图就是修改Test项目的连接库顺序,先连接Lib2,再连接Lib1

    改变顺序后,funcfunc2均使用2.obj连接。1.obj不再起任何作用。

    如果Test同时使用func1func2func函数,问题就很麻烦了。一种可行的解决方案就是:把1.obj2.obj里的func函数封装到两个动态连接库里。

    1.2 模块合并

    可以把一个库文件里的obj模块嵌入到另一个库文件内。举例说明:

    假定Lib1工程只有一个源文件1.cppLib2工程只有一个源文件2.cpp。则生成的Lib1.libLib2.lib结构如下图所示:

     

    现在,设置Lib2依赖于Lib1,如下图所示:

    重新编译Lib2,此时Lib2.lib结构如下图所示。

    可见:Lib1的模块被合并至Lib2内。

    1.2.1 模块替换

    假定Lib1Lib2工程都只有一个源文件1.cppLib2依赖于Lib1,则编译Lib2生成的Lib2.lib中,1.objLib1的,还是Lib2的?经过试验得知:这个1.objLib2工程里的。生成顺序:首先把Lib1.lib里的模块全部加入Lib2.lib中,接着编译Lib2中的源文件,最后将生成的obj加入Lib2.lib中,如果有同名的obj则替换掉。

    1.3 内联函数

    假定Static.lib里有函数int Test()的代码如下:

    int Test()

    {

    return 0;

    } 

    客户端程序使用Test函数的代码如下:

    #define USE_INLINE 1

    #if USE_INLINE

    inline int Test()

    {

    return 1;

    }

    #else

    int Test();

    #endif

    #pragma comment(lib,"Static.lib")

     

    void main()

    {

    int n = Test();

    } 

    USE_INLINE非零时,n将是1。也就是说main调用了内联函数Test

    USE_INLINE为零时,n将是0。也就是说main调用了Static.lib里的Test函数(非内联函数)。

  • 相关阅读:
    批量修改mp3文件播放速度
    尝试了一下alsa录音播放的编程。
    最快速获取天气的方法
    乒乓Buffer
    GCC编译选项和环境变量
    Linux发行版本
    memcpy 和 memmove
    自动定位android ndk的路径
    记一下,安装和使用Ubuntu过程中遇到的问题
    Android API 和Android 版本对照
  • 原文地址:https://www.cnblogs.com/hanford/p/6028085.html
Copyright © 2020-2023  润新知