我无法显示代码(因为它是专有的)。我有一个文件调用别处定义的类的方法,因此我包含该类的 header 。我的 IDE 智能感知可以确定方法所在的位置。但是,在编译和安装二进制文件后,当我运行该应用程序时,它崩溃了,指出上述类中的方法缺少符号。
我检查了库符号(使用 nm),但缺少我需要的符号。
我的问题是,考虑到我已经包含了标题,还有什么其他可能的事情可以解释为什么缺少符号?如果有来自另一个 header 的相同方法签名,是否会在共享库中列出两者(而不是没有)?
问题可能出在 cmake 上,它没有链接第二个标题吗?我该如何检查?
considering I have included the header, what other possible things could explain why the symbol is missing?
包含 header 永远不足以获得符号;您必须还链接到其他类的对象文件(或库)中。
Could the problem be with cmake that its not linking the second header?
您感到困惑: header 在链接中根本不起任何作用,只有目标文件和库起作用。
您的困惑的可能来源:Microsoft 编译器支持神奇的 #pragma comment(lib, "foo")
。如果你 #include
一个包含这样的 pragma
的 header ,然后将你的对象提供给链接器,它会方便地自动附加 foo.lib
到您的链接行。
UNIX 链接器通常没有这种“黑魔法”,整个功能被一些人认为是错误功能。