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

标签 linux build cmake makefile shared-libraries

<分区>

我无法显示代码(因为它是专有的)。我有一个文件调用别处定义的类的方法,因此我包含该类的 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 链接器通常没有这种“黑魔法”,整个功能被一些人认为是错误功能。

关于linux - 共享库不包含包含方法的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35381927/

相关文章:

linux - 我应该为此编写设备驱动程序吗?

linux - 在 Go 中只接受来自 Localhost 的 HTTP 连接?

linux - 在 Bash 编程中从标准输入读取

linux - Bash init - 在特定用户下启动服务

android - 如何自动将 Android 应用程序从 Jenkins 上传到 Google Play Alpha 测试?

xcode - 构建应用程序,使其可以在不同版本的 OS X 上运行

java - 构建与编译 (Java)

c++ - 如何在 IDE 中让 CMake 显示不属于任何二进制目标的 header ?

linux - 如何在cmake中使用CHECK_LIBRARY_EXISTS?

c++ - OS X cmake 链接 stdlibc++,mongodb c++ 驱动程序问题