我一直在研究和测试一个基于这里描述的自我注册的抽象工厂:
https://stackoverflow.com/a/582456
在我的所有测试案例中,它都像魅力一样,并且……
与直觉相反,包括链接命令中的存档与包含存档中的所有对象文件不同。仅包括解析未定义符号所需的归档中的那些目标文件。如果你考虑到一旦没有动态链接,那么这是一件好事,否则任何库(想想C库)都会被复制到每个可执行文件中。这是ld(1)联机帮助页(Linux上的GNU ld)必须说的:
链接器将仅在命令行上指定的位置搜索一次存档。如果存档定义了在命令行上存档之前出现的某个对象中未定义的符号,则链接器将包含存档中的相应文件。但是,稍后在命令行中出现的对象中的未定义符号将不会导致链接器再次搜索存档。
遗憾的是,没有标准方法可以在链接的可执行文件中包含存档的每个成员。在linux上你可以使用 g++ -Wl,-whole-archive 在Mac OS X上你可以使用 g++ -all_load 。
g++ -Wl,-whole-archive
g++ -all_load
所以使用GNU binutils ld,link命令应该是
g++ -o testFactory -Wl,-whole-archive libbase.a -Wl,-no-whole-archive main.cpp
该 -Wl,-no-whole-archive 确保g ++生成的最终链接命令中稍后出现的任何存档将以正常方式链接。
-Wl,-no-whole-archive