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

这种说法只能说半对半错吧,以上说法只是在每个cpp文件没有关联的前提下,在大多数情况下cpp文件之间是存在依赖的,如果调用的函数依赖到了其他文件函数,那么相应的obj文件也是要链接进exe的。
以下是对这种说法的验证(在cpp文件之间没关联的前提下):
1.首先做个静态库,整个工程结构如下(一个头文件,六个对应的实现文件):
2.建立一个测试工程来测试以上说法:
@1先只调用lib中的一个DisplayArrary函数:
- // use_lib.cpp : 定义控制台应用程序的入口点。
- //
-
- #include "stdafx.h"
- #include "header.h"
- #include <iostream>
- #include<vector>
- using namespace std;
- #pragma comment(lib, "test_lib.lib")
- int main()
- {
- int arr[] = { 1, 3, 5, 7, 9 };
- //cout << add(2, 4) << endl;
- // cout << mut(6, 3) << endl;
- //cout << sub(5, 6) << endl;
- DisplayArrary(arr);
- //hello();
- return 0;
- }
编译后exe文件36KB大小:
@2 接下来把lib中的方法全部调用:
- #include "stdafx.h"
- #include "header.h"
- #include <iostream>
- #include<vector>
- using namespace std;
- #pragma comment(lib, "test_lib.lib")
- int main()
- {
- int arr[] = { 1, 3, 5, 7, 9 };
- cout << add(2, 4) << endl;
- cout << mut(6, 3) << endl;
- cout << sub(5, 6) << endl;
- DisplayArrary(arr);
- hello();
- return 0;
- }
编译后exe文件大小为46KB:
从以上实验结果可以看出编译器在链接lib时只是链接用到的obj,而不是链接整个lib。之前我一直以为,包括很多对lib的解释的文章都是说lib就是obj的集合,链接的时候链接整个lib,通过实验可以看出这种说法显然是不准确的。不过一般的程序cpp文件之间是有关联的,所以可以认为链接整个lib吧。
|