昨天在VC/MFC论坛有人说了如下这么一段话(基本上把lib的概念说清楚了,不过有点小问题):
这种说法只能说半对半错吧,以上说法只是在每个cpp文件没有关联的前提下,在大多数情况下cpp文件之间是存在依赖的,如果调用的函数依赖到了其他文件 函数,那么相应的obj文件也是要链接进exe的。
以下是对这种说法的验证(在cpp文件之间没关联的前提下):
1.首先做个静态库,整个工程结构如下(一个头文件,六个对应的实现文件):
2.建立一个测试工程来测试以上说法:
@1先只调用lib中的一个DisplayArrary函数:
// use_lib.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "header.h"#include#include 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编译后exe文件大小为46KB:#include 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;}
从以上实验结果可以看出编译器在链接lib时只是链接用到的obj,而不是链接整个lib。之前我一直以为,包括很多对lib的解释的文章都是说lib就是obj的集合,链接的时候链接整个lib,通过实验可以看出这种说法显然是不准确的。不过一般的程序cpp文件之间是有关联的,所以可以认为链接整个lib吧。