【问题标题】:Checking whether static library defines all symbols检查静态库是否定义了所有符号
【发布时间】:2013-05-07 10:54:05
【问题描述】:

我有一堆文件,编译成一个库,链接到各个项目,但大多数项目只需要相对较小的一部分。所以我需要把它分成几层。

要正确地做到这一点,我想检查下层不依赖于上层的任何东西。在 Linux 上,我只需将库共享并将 -Wl,--no-undefined 传递给链接。但是我需要在动态库需要显式导出并且源没有为此准备好的 Windows 上执行此操作。

我还可以为每一层准备一个单元测试,并在链接期间弹出未定义的符号。但是,我只对一小部分类进行了单元测试,即使我添加了它们,如果添加了某些东西但没有经过测试,它们仍然不会捕获。

那么有没有其他方法可以检查静态库是否不需要任何符号,除了指定的其他库集?我可以使用 Visual C++ 9.0 (2008) 或 MinGW。

【问题讨论】:

  • -no-undefined 是 link.exe 的默认值,不清楚为什么需要以不同方式执行此操作。您也不需要在源代码中显式导出,只需 .def 文件中的列表即可。
  • @HansPassant:静态库不是使用 link.exe 构建的,我相信我提到了为什么我不能让它们在 Windows 上共享 (dll)。

标签: c++ windows linker


【解决方案1】:

嗯,我可以与您分享一些我想出的针对特定于 Visual Studio 的强制链接。它并不完全扫描以确保所有符号都已链接,尽管这在强制注册全局变量链接时适用于我自己(实际上并没有在代码中的任何地方引用)。放置在标题中:

#define DECLARE_OBJ( TYPE, INSTANCE_NAME ) \
  extern "C" TYPE INSTANCE_NAME; \
  __pragma( comment ( linker, "/INCLUDE:_" __STRINGIZE( INSTANCE_NAME ) ) )

这确实会发出关于两个编译时字符串之间的空格的警告。 iirc 我将警告删除了,因为它完全没用。希望这会有所帮助。

【讨论】:

  • 我相信为了避免警告你可以写__STRINGIZE(/INCLUDE:_##INSTANCE_NAME)。我最近为 gcc 做了类似的事情,它根本不接受 pragma 中的单独字符串。
猜你喜欢
  • 2011-06-03
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
相关资源
最近更新 更多