动态库是像Windows那样两个文件(.lib/.dll)好，还是Linux那样合二为一(.so)好？
Windows 的那个.lib 指的是编译期用到的那个.lib，Linux 里面也用那个.so文件。最近发现这个差别对库的部署影响还蛮大的。
这个回答下面，有很多只用过Linux动态库，没用过Windows动态库的程序员，在这里胡乱回答问题。为了防止抬杠，特此申明：以下文字只考虑在Windows上用微软的开发工具，在Linux上用GNU的开发工具。不考虑「血统不纯」的开发方式（例如在Windows上用MinGW或者Cygwin等等）。首先，这个是没错的：动态库在Windows上是*.dll，在Linux上是*.so。静态库在Windows上是*.lib，在Linux上是*.a。此外，对于运行时动态链接(run-time dynamic linking) ，又名显式链接 (explicit linking)，无论是Windows还是Linux，都只要运行一半的时候，调用一个加载动态库的函数（比如 Windows 上的 LoadLibrary 和 Linux上的 dlopen ），就可以加载动态库了。这个确实跟静态库一点关系都没有。但是，很多 Linux 程序员不知道的是：对于加载时动态链接 (load-time dynamic linking) ，又名隐式链接 (implicit linking) ，在Windows上构建时，动态库还依赖一个导入库(import library) ，而不能像 Linux 那样「直接」链接上动态库。导入库也是 *.lib，文件格式上就是静态库的文件格式。只不过导入库只有符号表，没有实际的函数体。当然这个东西只是构建时需要，发布之后是不需要的。Windows上隐式链接test.dll 依赖导入库test.lib题主说的情况，显然是指加载时动态链接，即隐式链接。哪个好呢？各有好坏。Windows的做法看似很麻烦，需要一个动态库文件和一个导入库文件，但是链接顺序就没有要求了。Linux的做法只要一个动态库文件，看似省事，但是有加载顺序要求，比如main.c 依赖 lib1.so ，然后 lib1.so 依赖 lib2.so ，那么你需要写成 -l1 -l2 ，而不可以写成 -l2 -l1。这就是缺陷。Linux上的动态库的依赖顺序问题