编译和链接是不同的,编译时不需要找到对应的库文件,链接时才需要。链接时它也不找,而是采取如下办法:
1. 把所有需要的库中的符号都载入内存(这里需要的库是工程里设置好的,而不是根据头文件变化而变化的)
2. 链接时如果需要一个函数,链接程序会到步骤1中的符号表中找,并进行定位。
所以无论在哪个库文件中,只要你在工程中指定它为需要的库,则链接程序都会载入它的符号到符号表。要找到需要的函数,不需要知道它在哪个库文件中,只要符号表有即可。
因此库是必须指定的,在link的时候链接上,或者说,你直接编译出.obj文件就足够了,实际上,只要你编译成功,就没必要编译成lib文件。唯一的好处是减少编译时间。。。或者不希望别人看到源代码,link是一样link的。
生成静态动态库一般是通过工程选择库项目实现的。在Windows下推荐用IDE构建项目来生成和引用,在Linux下则往往写makefile来生成。
生成动态库还有点用。
每日小常识:
Linux下中间文件是.o,而Windows是.obj
Linux下静态库是.a,Windows下是.lib
Linux下动态库是.so,Windows下是.dll