【问题标题】:Can I make a header from a Static Library?我可以从静态库中制作标题吗?
【发布时间】:2012-06-16 23:42:31
【问题描述】:

我有一个库 (ws2_32) 和一个头文件 (ws2tcpip.h),但由于某种原因,库中的某些函数不在头文件中。有没有办法可以确定方法签名,以便我自己将它们包含在标头中?

asdf@fdsa ~$ strings /usr/lib/w32api/libws2_32.a | grep -i 'inet_*ntop'
_inet_ntop@16
__imp__inet_ntop@16
_InetNtopW@16
__imp__InetNtopW@16
inet_ntop                      <<< I need this one
_inet_ntop@16
__imp__inet_ntop@16
InetNtopW                      <<< or this one
_InetNtopW@16
__imp__InetNtopW@16
asdf@fdsa ~$ grep -i -B 4 -A 2 -R "ntop" /usr/include/w32api/ws2tcpip.h
asdf@fdsa ~$                  

这应该是可能的,因为链接器必须验证这一点,不是吗?

参考:InetNtop and ws2tcpip.h under GCC / Cygwin

【问题讨论】:

  • 对于 C 函数,链接器通常只检查函数名是否匹配,而不是检查它们是否具有相同的类型或调用约定。在某些系统上,链接器甚至不会验证您调用的函数是否是函数,它可能是一大块数据。

标签: c winapi gcc cygwin winsock2


【解决方案1】:

不,没有。并非没有拆卸库并进行大量猜测。总的来说,认为它是没有希望的。

但是,InetNtopWinet_ntop 之类的函数已记录在案 (MSDN),因此我们知道函数签名是什么。请注意,这些功能被标记为需要 Vista,并且您确实可以在 WS2tcpip.h 中看到它们被一个守卫包围:

#if (NTDDI_VERSION >= NTDDI_VISTA)

因此,除非您为 Vista 支持定义预处理器宏,否则您将无法获得原型。

// Require Vista
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
#include <WS2tcpip.h>

或者,您可以使用WSAAddressToString。这是一个类似的功能,但不完全兼容。 WSAAddressToString 在 Windows 2000 中可用。

脚注: InetNtopWinet_ntop 函数基本相同,除了 W 版本采用 wchar_tinet_ntop 采用 char。许多 Windows 功能都是这样复制的。

【讨论】:

  • 我确实有所需的#defines,但我可以向您保证,定义不在标题中(根据 grep)。我知道 WSA* 功能,但在这种情况下我不能使用它们。您的链接指向 InetNtop 的 MSDN,但如果您注意到库文件中没有表示(根据字符串)
  • @Huckle: InetNtop 不会出现在库中,因为它不是一个函数,它是一个预处理器宏,定义为 InetNtopWinet_ntop,具体取决于 @ 的值987654337@ 宏。您是否有不能使用WSA 函数的原因?
  • WSA 函数都需要在使用前调用 WSAStartup,但我的程序的主要目的是根本不使用套接字,所以我不想浪费时间/内存来初始化某些东西当有一个一次性功能可以在没有额外开销的情况下做同样的事情。我不需要在 Vista 之前的任何东西上使用它(因为无论如何它都会在 *nix 下使用,在 80% 的情况下)。您能否将您的 Ws2tcpip.h 副本发布到 pastebin 以便我进行比较?
  • @Huckle:inet_ntop 函数也是 Windows 套接字函数,这意味着同样的限制适用。这不仅仅取决于函数是否以 WSA 开头。
  • 来自您的链接:“InetNtop 函数不需要加载 Windows Sockets DLL 来执行 IP 地址到字符串的转换”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多