【发布时间】:2015-07-15 05:01:38
【问题描述】:
我有一个 C 语言项目,我将其从 unix/linux 移植到 Windows/Cygwin(使用自动工具)。 我需要调用一些winapi函数。这些功能需要包含一些窗口标题。但是当我指定这些时,会引发很多由重新定义某些结构或函数引起的错误。
所以我决定创建一个静态库,在其中调用所有 winapi 函数以避免这些错误。但是我很难让它工作。
目前静态库只包含一个调用winapi函数GetAdaptersAddresses,看起来像这样:
#include <windows.h>
#include <winsock2.h>
#include <iphlpapi.h>
void win_if_scan(void)
{
ULONG size = 10 * sizeof(IP_ADAPTER_ADDRESSES);
IP_ADAPTER_ADDRESSES *addresses = (IP_ADAPTER_ADDRESSES *)malloc(size);
GetAdaptersAddresses(AF_INET,
GAA_FLAG_INCLUDE_ALL_INTERFACES |
GAA_FLAG_INCLUDE_PREFIX |
GAA_FLAG_SKIP_DNS_SERVER,
NULL,
addresses,
&size);
}
我正在像这样编译库libwin.a:
gcc libwin.c -liphlpapi -o libwin.o
ar crv libwin.a libwin.o
在项目中我调用了win_if_scan 函数(并且我包含了libwin 的标头)。但我收到错误:undefined reference to WinMain,完整消息是:
$ make > /dev/null
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../lib/libcygwin.a(libcmain.o): In function `main':
/usr/src/debug/cygwin-1.7.33-1/winsup/cygwin/lib/libcmain.c:39: undefined reference to `WinMain'
/usr/src/debug/cygwin-1.7.33-1/winsup/cygwin/lib/libcmain.c:39:(.text.startup+0x7e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain'
collect2: error: ld returned 1 exit status
make[1]: *** [libwin.o] Error 1
make: *** [all] Error 2
我不明白这里发生了什么。它是一个库,为什么它需要 main 函数?当我尝试添加时:
int main(void) { return 0; }
或
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { return 0; }
它确实像预期的那样说了main的多重定义。
如何获得这项工作? 或者有没有更好的方法来处理 cygwin 和 windows 头文件之间的重新定义错误?
【问题讨论】:
-
哦,我明白我做错了什么。创建库存档时,我需要指定只创建目标文件,而不是可执行文件。否则它需要有一个入口点(主要功能)。所以我在编译libwin时添加了
-c选项:gcc -c libwin.c -liphlpapi -o libwin.o但是现在找不到GetAdaptersAddresses的定义。