2016-01-26 30 views
0

我刚刚建立了一个共享库,但是当我使用纳米命令查找依赖输出如下纳米输出不正确

$ nm -a libgio-2.0.so.0.2701.0 | grep ZLIB 
    U [email protected]@ZLIB_1.2.2 
    U [email protected]@ZLIB_1.2.2 

我不知道均值的@@ZLIB_1.2.2,实际上建筑libgio的命令是

gcc -o libgio-2.0.so.0.2701.0 libfoo.so libbar.so libz.so.1.2.8 

其中libz.so.1.2.8从我自己的源建成并投入libgio-2.0.so.0.2701.0的同一目录下。这不是同一版本系统的libz进行(/usr/lib/libz.so)

所以,我的问题是,为什么@@zlibnm输出1.2.2,不1.2.8? nm输出的@@ZLIB_1.2.2的平均值是多少?

感谢

回答

0

nm是显示版本的符号和版本是没有错的。

所以,我的问题是为什么@@ zlib的nm输出是1.2.2,而不是1.2.8?

因为这是您链接到的库中符号的版本。符号的版本不必与库的版本相同。

以及在nm输出中@@ ZLIB_1.2.2的含义是什么?

这意味着deflateSetHeader符号当前定义版本1.2.2

它仍然是1.2.8版本相同,因为zlib库的那些版本相互兼容加入。版本1.2.8提供了与版本1.2.2相同的符号,并且它们是兼容的。新库也可能会提供一些额外的符号,它们的版本号为ZLIB_1.2.2,但是您的库不使用它们,因此您在nm输出中看不到任何对它们的引用。

基本上一切正常,没有什么可担心的。您的程序需要版本1.2.2中的符号以及您提供这些符号的库。

+1

您可能会澄清,开发人员在构建库时选择'ZLIB',并且它不一定是库的*名称*。 –

+0

感谢乔纳森和托马斯的详细评论。所以@@版本不是实际的链接库的版本,而是符号的版本。在我的情况下,该程序仍然链接zib 1.2.8,而不是1.2.2,这是正确的吗? –

+0

该程序将链接到任何链接它(以及运行时加载程序在运行时发现的内容)。使用'nm'不能告诉你程序链接到哪个库,它只能显示你缺少的符号。 'deflateSetHeader @@ ZLIB_1.2.2'只是一个符号的名字(装饰着一些额外的信息,使它不同于'deflateSetHeader @@ ZLIB_0.1.1')。要查看程序链接的库,请使用'ldd'而不是'nm'。 –