簡體   English   中英

在cygwin下編譯和鏈接靜態庫調用winapi

[英]Compile & link static library calling winapi under cygwin

我在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

這項工作仍在進行中,非常抱歉,不是很好的解決方案或系統的解決方案,但是有這個想法。

有心靈上的重要的事情,也是位置-liphlpapi在Makefile規則提到一個在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM