分享

用实验来说明lib的概念及链接方式

 CodeNutter 2016-05-17


                           昨天在VC/MFC论坛有人说了如下这么一段话(基本上把lib的概念说清楚了,不过有点小问题):

                         这种说法只能说半对半错吧,以上说法只是在每个cpp文件没有关联的前提下,在大多数情况下cpp文件之间是存在依赖的,如果调用的函数依赖到了其他文件函数,那么相应的obj文件也是要链接进exe的。

                   以下是对这种说法的验证(在cpp文件之间没关联的前提下):
                  1.首先做个静态库,整个工程结构如下(一个头文件,六个对应的实现文件):

                                                   
                    2.建立一个测试工程来测试以上说法:
                       @1先只调用lib中的一个DisplayArrary函数:
                   
  1. // use_lib.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "header.h"  
  6. #include <iostream>  
  7. #include<vector>  
  8. using namespace std;  
  9. #pragma comment(lib, "test_lib.lib")  
  10. int main()  
  11. {  
  12.     int arr[] = { 1, 3, 5, 7, 9 };  
  13.     //cout << add(2, 4) << endl;  
  14.     // cout << mut(6, 3) << endl;  
  15.     //cout << sub(5, 6) << endl;  
  16.     DisplayArrary(arr);  
  17.     //hello();  
  18.     return 0;  
  19. }  

                      编译后exe文件36KB大小:
                       
                    @2 接下来把lib中的方法全部调用:
              
  1. #include "stdafx.h"  
  2. #include "header.h"  
  3. #include <iostream>  
  4. #include<vector>  
  5. using namespace std;  
  6. #pragma comment(lib, "test_lib.lib")  
  7. int main()  
  8. {  
  9.     int arr[] = { 1, 3, 5, 7, 9 };  
  10.     cout << add(2, 4) << endl;  
  11.     cout << mut(6, 3) << endl;  
  12.     cout << sub(5, 6) << endl;  
  13.     DisplayArrary(arr);  
  14.     hello();  
  15.     return 0;  
  16. }  
          编译后exe文件大小为46KB:
              
       从以上实验结果可以看出编译器在链接lib时只是链接用到的obj,而不是链接整个lib。之前我一直以为,包括很多对lib的解释的文章都是说lib就是obj的集合,链接的时候链接整个lib,通过实验可以看出这种说法显然是不准确的。不过一般的程序cpp文件之间是有关联的,所以可以认为链接整个lib吧。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多