2011-10-21 122 views
1

此問題在某處確實可以解答,但找不到它。我已經寫Java十幾年了,而我的C經驗是在Unix上,所以我在這裏只是一個平方。在我的Unix體驗中,有人編寫了makefile,它工作正常。將.a文件轉換爲.dll

我已經從feep下載了libtar-1.2.11的C源代碼,並從cygwin裏面運行了make。這創建了一個.a文件和一個.exe文件。 EXE文件似乎基本上是在Windows上運行的tar,但我想要的是讓這些庫在我自己的代碼中讀取和處理文件。

如果我沒有記錯的話,應該在.a文件(檔案??)中,這需要鏈接到我可以從我的C++程序中使用的庫。所以我正在尋找一種方法來做到這一點。

我正在寫一個庫,將使用.tgz文件,所以我想使用這個庫。我想我想將libtar變成一個DLL,並且自己創建一個DLL以供其他語言使用。

那麼,如何將我的.a文件變成其他應用程序可用的內容,以及如何從代碼中訪問它?

+0

我不熟悉轉換.a - > .dll的機制。但是,您可以編譯Windows機器上的源代碼來生成.dll。 –

+0

您將不會使用'.a'文件來創建DLL,您將直接使用源代碼。 –

+1

@MarkRansom是對的,你需要重新編譯。 '.a'文件通常不包含與位置無關的代碼(PIC),因此您無法動態鏈接所包含的代碼。 –

回答

4

生成的libmylib.a實際上是libtar-1.2.11的所有*.o的存檔。
你可以通過做nm libmylib.a來驗證,它會打印所有的*.o文件。
編寫代碼,並鏈接:

gcc -o my_application my_application.o -lmylib 

您使用Cygwin產生這種情況,可以不受限制,只要我知道生成的dll了這一點。

3

好了,DLL是相當於在Unix的共享庫(一.a是靜態鏈接庫,在Windows相當於是一個.LIB文件),所以要構建一個共享庫。

事實上,當你建立爲

make LDFLAGS=-shared

產生的libtar/libtar.exe實際上是一個名不副實的DLL。

但是,請注意,cygwin翻譯的DLL與本地Windows DLL不同,它將始終依賴Cygwin DLL(甚至可能安裝了Cygwin環境)來運行,因此如果您計劃將它包含在本地Windows代碼,這可能不是您想要追求的方法。

我可以建議你從大量死亡(2003年的最後一個版本)libtar切換到libarchive,它自帶Windows build instructions