簡體   English   中英

如何使用gfortran使用.dll構建.lib文件?

[英]How do I build a .lib file with my .dll using gfortran?

我需要使用gfortran在Windows上構建FORTRAN DLL,以便C ++與Visual Studio 2013一起調用它。

我有一個使用MSYS2構建的示例DLL,但是我不知道如何獲取Visual Studio的LIB文件。

在線搜索主要產生有關如何使用Visual Studio制作LIB文件以及如何僅通過DLL和頭文件創建LIB文件的結果。 但是我不想做涉及后者的令人討厭的事情,而且我也不需要這樣做,因為我是構建DLL的人。 我只想構建DLL並獲取它的LIB文件。

這樣的問題是一個例外,但是答案對我來說還不清楚。 似乎他在做其他事情,類似於我已經找到的在DLL已經存在之后創建LIB文件的其他解決方案……但是我不敢相信這是最佳解決方案。

我對事后創建不滿意的部分原因是,我希望將其放入流程中,以便其他開發人員可以在我之后使用該代碼-這不僅僅是一次構建的事情。 我不想給他們一個復雜的指令清單。

您知道如何執行此操作,或者對此有任何建議嗎?

這是我寫得不好的示例Makefile。 如果需要,我可以發布其余代碼。

Makefile :( 我的編輯器用空格替換了制表符)

FC=gfortran -g
CC=g++ -g

DLL_SRC_DIR=.
BUILD_DIR=build

all:
    $(FC) -c $(DLL_SRC_DIR)/fdll.f90 -o $(BUILD_DIR)/fdll.o

    $(CC) -c -DBUILDING_C_DLL $(DLL_SRC_DIR)/cdll.cpp -o $(BUILD_DIR)/cdll.o
    $(CC) -shared -o $(BUILD_DIR)/cdll.dll $(BUILD_DIR)/cdll.o $(BUILD_DIR)/fdll.o -Wl,--out-implib,$(BUILD_DIR)/libcdll.a -lgfortran

clean:
    rm -f $(BUILD_DIR)/*

編輯:感謝IanH,這是我的新Makefile!

FC=gfortran -g
CC=g++ -g

DLL_SRC_DIR=.
BUILD_DIR=build

all:
    $(FC) -c $(DLL_SRC_DIR)/fdll.f90 -o $(BUILD_DIR)/fdll.o

    $(CC) -c -DBUILDING_C_DLL $(DLL_SRC_DIR)/cdll.cpp -o $(BUILD_DIR)/cdll.o
    $(CC) -shared -o $(BUILD_DIR)/libcdll.dll $(BUILD_DIR)/cdll.o $(BUILD_DIR)/fdll.o -Wl,--out-implib,$(BUILD_DIR)/libcdll.a,--output-def,$(BUILD_DIR)/libcdll.def -lgfortran
    /c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio\ 12.0/VC/BIN/lib /MACHINE:x86 /DEF:$(BUILD_DIR)\\libcdll.def /OUT:$(BUILD_DIR)\\libcdll.lib

clean:
    rm -f $(BUILD_DIR)/*

可以指示gcc鏈接器輸出模塊定義文件(.def擴展名),該文件描述了DLL的所有導出。

然后,可以通過Microsoft庫管理器將此def文件轉換為導入庫(.lib文件的一種形式),然后其他面向Windows的工具可以使用該靜態庫。

將您的鏈接行更改為:

$(CC) -shared -o $(BUILD_DIR)/cdll.dll $(BUILD_DIR)/cdll.o \
    $(BUILD_DIR)/fdll.o \
    -Wl,--out-implib,$(BUILD_DIR)/libcdll.a,--output-def,$(BUILD_DIR)/libcdll.def \
    -lgfortran

並添加新行以生成靜態庫,例如:

LIB.EXE /MACHINE:x64 /DEF:$(BUILD_DIR)\libcdll.def /OUT:$(BUILD_DIR)\libcdll.lib

如果不針對x64進行編譯,請將x64更改為適當的計算機類型。 如果BUILD_DIR包含空格或類似內容,則BUILD_DIR引起混淆。

然后可以將靜態庫提供給cl.exe Microsoft編譯器驅動程序的調用。

請注意,在一個進程中使用具有不同運行時庫的可執行模塊(DLL,EXE)時,需要特別注意。

暫無
暫無

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

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