我在C中有一个项目,正在从unix / linux移植到Windows / Cygwin(使用自动工具)。
我需要调用一些winapi函数。这些功能需要包含一些Windows标头。但是,当我指定那些包含许多由于重新定义某些结构或函数而引起的错误时,就会引发这些错误。

因此,我决定创建一个静态库,在其中将调用所有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仅生成目标文件,如我在注释中所述。
其次,库-liphlpapi的规范必须放在将项目链接在一起的位置,而不是在生成目标文件的位置。这是有道理的,因为那里没有链接。
因此,通过以下命令创建库归档文件:

gcc -c libwin.c -o libwin.o
ar crv libwin.a libwin.o


项目是这样链接在一起的:

$(exedir)/bin: $(bin-dep)
    $(CC) $(LDFLAGS) -o $@ $^ ../libwin/libwin.a $(LIBS) -liphlpapi


这是一个Makefile规则,您可以在其中查看在何处添加../libwin/libwin.a-liphlpapi

这项工作仍在进行中,因此对于不太好的解决方案或系统的解决方案感到抱歉,但想法仍然存在。

要记住的重要事项也是-liphlpapi在Makefile规则中的位置,如a here所述

09-26 20:33