我要写一个叫做 foo 的库,它提供一个什么也不做的函数。这个库的头文件为 foo.h:
foo.c 是这个库的实现:
用 gcc 编译生成共享库文件 libfoo.so:
如果用 clang,可以这样:
如果是在 Windows 环境中(例如 mingw 或 cygwin 之类的环境),可以这样:
于是,问题就出现了……如果我想让 foo 库能够跨平台运行,那么我就不得不为每一个特定的平台提供相应的编译命令或脚本。这意味着,你必须知道各个平台在共享库支持方面的差异及处理方式。这通常是很烦琐很无趣的事,何况我还没说构建静态库的事。 这时候,一个 10000 多行的 Bash Shell 脚本 libtool 站了出来,这些破事,我来做! 要有效的消除各个环境差异性,往往有三种办法。 第一种办法是**……不要害怕,不是革程序猿的命,而是革环境的命。譬如 Windows(我更愿意是 Linux)扫清寰宇,一统天下,那么环境的差异性也就不存在了。但是,人类的历史已经证明了这条路是走不通的。因为,一旦某个环境绝对的统治了一切,那么它下一步要面对的问题就是自身的**……整部中国历史记录的都是这种事! 第二种办法是改良……有一批人仁志士成立了某个团体,颁布了一些标准,并号召大家都遵守这个标准,别再自行其是。C 语言标准,C 标准,scheme 标准……都挺成功的。现在似乎还没有共享库或动态链接库标准。 第三种办法是和谐不要害怕,这里没有 GFW就是承认现实就是这么个狗血的现实,然后追求和而不同。 libtool 选择了第三种办法。 gcc 编译生成共享库的命令可以粗略的拆分为两步编译与连接:
与之相应,libtool 说,如果你要用 gcc 编译生成一个共享库,不管它是在 Linux 里,还是在 Solaris,还是在 Mac OS X 里,或者是在 Windows 里(Cygwin 或 MinGW),可以使用同样的命令:
似乎 libtool 把问题弄得更复杂了!不过,仔细观察一下,可以发现一些规律。比如这两个命令的前面一半都是:
libtool 支持 7 种模式,除了上述两种模式之外,还有执行、安装、完成、卸载、清理等模式。每个模式都对应于库的某个开发阶段。这 7 种模式抽象了大部分平台上的库的开发过程。这是 libtool 和而不同的第一步:库开发过程的抽象。 下面来看编译过程,当 libtool 的
|
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|