共享库不包含包含方法的符号?

时间:2016-02-13 15:53:04

标签: linux build cmake makefile shared-libraries

我无法显示代码(作为其专有)。我有一个文件调用其他地方定义的类的方法,所以我包括该类的标头。我的IDE intellisense可以确定方法的位置。但是,在编译和安装二进制文件之后,当我运行应用程序时,它会崩溃,引用上述类中的方法缺少的符号。

我检查了库符号(使用nm),并且缺少了我需要的符号。

我的问题是,考虑到我已经包含了标题,其他可能的东西可以解释为什么符号丢失了?如果来自另一个头的方法签名相同,那么共享库中是否会列出(而不是没有)?

问题可能在于cmake没有链接第二个标题吗?我怎么能检查这个?

1 个答案:

答案 0 :(得分:1)

  

考虑到我已经包含了标题,其他可能的东西可以解释为什么符号丢失了?

包含标题从不足以获得符号; 必须还链接到另一个类的目标文件(或库)中。

  

问题可能在于cmake没有链接第二个标题吗?

您感到困惑:标题在链接中根本不起任何作用,只有目标文件和库可以。

混淆的可能来源:Microsoft编译器支持神奇的#pragma comment(lib, "foo")。如果您#include包含此类pragma的标头,然后将您的对象提供给链接器,它会方便地自动将foo.lib附加到您的链接行。

UNIX连接器通常没有这种“黑魔法”,并且整个功能被一些人视为 mis - 特征。