繁体   English   中英

静态和动态库链接

[英]Static and dynamic library linking

在C ++中,静态库A链接到动态库B和C。如果在B中定义的A中使用了Foo类,那么如果不使用Foo,C会链接吗?

我以为答案是肯定的,但是我现在遇到xlc_r7的问题,其中库C说Foo是未定义的符号,就C而言。 我的问题是库C没有使用引用它的类。 此链接在Win32(VC6)和OpenVMS中。

这是链接器差异还是PBCAK?

新信息:

  1. B取决于C,但反之则不。

  2. 我没有在Windows上使用/ OPT:REF进行链接,并且链接没有问题。

静态链接时,两个模块成为一个。 因此,当您编译C并将A链接到其中时,就好像您已经将A的所有源代码都复制到C的源代码中一样,然后编译了组合的源。 因此C.dll包含A,它通过Foo对B具有依赖性。 您需要将C链接到B的链接库,以满足这种依赖性。

请注意,根据您的信息,这将在B和C之间创建循环依赖关系。

听起来好像是链接器(ld / unix),因为ld从左到右链接了ld(我使用过的大多数版本)库,并且如果第一个引用中有后面的引用,则需要通常的技巧是将第一个库(或任何必需的库)附加到命令末尾。

尝试一下看看...

您的C链接行是否包括B的导出库? 如果是这样,那么正如理查德(Richard)所建议的那样,这听起来像是在订货。

另一个建议是,如果C不需要A的功能,则查看是否有链接器选项可以忽略未引用的符号。对于Microsoft链接器,这是通过/ OPT:REF开关实现的。

C无法链接的唯一原因是编译器认为它确实需要Foo符号。

由于C不引用Foo符号,因此链接器需要该符号还有另一个原因。

我知道的唯一另一个原因是某种出口。 我只了解Visual C ++,所以建议您在预处理的文件中搜索__declspec( dllexport )等效项,并查看生成它的原因。

我要做的是:将预处理器输出存储在一个单独的文件中,并在其中搜索Foo的出现。 它要么作为导出出现,要么已被编译器以某种方式引用。

如果不需要定义特定功能,则在链接阶段不会链接该库。 在您的情况下,由于foo的定义存在于库B中,而不存在于库C中。因此,在加载可执行文件时,库C将不会被加载到内存中。

但是看来,您也在库C中使用了foo()函数,因此您将得到相应的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM