我在C中有一个项目,我从unix / linux移植到Windows / Cygwin(使用autotools)。 我需要调用一些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
我不明白这里发生了什么。它是一个库,为什么它需要主要功能?当我试图添加:
int main(void) { return 0; }
或
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { return 0; }
它确实表达了main
的多重定义。
如何使这项工作? 或者有更好的方法来处理cygwin和amp;之间的重新定义错误。 Windows标题?
答案 0 :(得分:1)
第一步是仅从我在评论中提到的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
这仍然是一项正在进行中的工作,很抱歉没有非常好的或系统的解决方案,但这个想法就在那里。
要记住的重要事项还有Make -liphlpapi
在Makefile规则中的位置a here