gpt4 book ai didi

cygwin下调用winapi编译链接静态库

转载 作者:行者123 更新时间:2023-11-30 15:20:22 31 4
gpt4 key购买 nike

我有一个 C 语言项目,正在将其从 unix/linux 移植到 Windows/Cygwin (使用 autotools)。我需要调用一些winapi函数。这些函数需要包含一些 Windows header 。但是当我指定这些包含时,会引发由于重新定义某些结构或函数而引起的许多错误。

因此我决定创建一个静态库,其中将调用所有 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 的 header )。但我收到错误:对 WinMain 的 undefined reference ,完整消息是:

$ 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 header 之间的重新定义错误?

最佳答案

第一步是仅从 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

这仍然是一项正在进行的工作,很抱歉没有很好或系统的解决方案,但想法是存在的。

需要记住的重要一点是 Makefile 规则中 -liphlpapi 的位置,如前所述 a here

关于cygwin下调用winapi编译链接静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30053351/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com