我正在编写一个相当大的C ++共享对象库,并且遇到了一个使调试困难的小问题:
如果我在头文件中定义函数/方法,却忘记为它创建存根(在开发过程中),因为我正在构建为共享对象库而不是可执行文件,那么编译时不会出现任何错误,告诉我忘记实现该功能。我发现问题的唯一方法是在运行时,当最终与该库链接的应用程序崩溃并出现“未定义符号”错误时。
我正在寻找一种简单的方法来检查我在编译时是否具有所需的所有符号,也许可以将它们添加到我的Makefile中。
我想出的一个解决方案是运行已编译的库,nm -C -U
以获取所有未定义引用的已分解列表。问题在于,这还会列出其他库(例如GLibC)中所有引用的列表,当最终应用程序放在一起时,这些引用当然会与此库链接在一起。这将有可能使用的输出nm
,以grep
通过所有我的头文件,看看是否有任何名称的对应..但这似乎疯了。当然这不是一个不常见的问题,并且有更好的解决方法?
nm -C -u
救了我多次!(请注意-u
系统上的小写字母。)在此处保留此注释,以便下次需要时可以找到它。