1 c c++ g++ shared-libraries ld
有一个免费的软件项目,它构建一些静态的c ++库,然后链接它们来制作一个二进制文件.我想将库分离为.so文件以进行动态链接(因此其他项目可能会使用lib).一个库构建得很好,但是当我尝试链接它时,我得到"未定义的引用"错误.
这些很容易跟踪和修复(代码引用了.h文件中的那些方法,但相应的.cc文件未包含在Makefile编译命令中).但是,我想知道为什么,作为一般事项,库可以作为静态库而不是动态库链接.什么是g ++和ld在一个案例中而不是另一个案例?
非常感谢.
用ar创建的静态库只是一堆目标文件.ar是一个非常简单的归档器.链接时没有解析依赖关系,请参阅ar的手册页.
另一方面,共享对象或您调用它们的动态库是一种非常不同的野兽.它们实现ELF二进制格式并具有复杂的规则集.它们还具有初始化代码,并且在链接时解析了一些依赖项.有关更深入的介绍,请参见http://www.akkadia.org/drepper/dsohowto.pdf和http://www.akkadia.org/drepper/goodpractice.pdf.