2016-10-10 84 views
0

我需要使用gfortran在Windows上建立一個FORTRAN DLL,使得它可以通過C++和Visual Studio 2013年如何使用gfortran使用我的.dll構建.lib文件?

我有與MSYS2樣品DLL建築被調用,但我無法弄清楚如何獲取Visual Studio的LIB文件。

在線搜索主要產生了關於如何使用Visual Studio製作LIB文件以及如何僅通過DLL和頭文件創建LIB文件的結果。但我不想做後者中涉及的令人討厭的東西,我不認爲我需要,因爲我是構建DLL的人。我只是想構建DLL並獲取我的LIB文件。

有一個例外是this SO question,但答案並不明確。看起來他正在做類似於在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)/* 

回答

1

gcc的接頭可以指示輸出描述所有從DLL出口模塊定義文件(擴展名.def)。

這個def文件然後可以被Microsoft庫管理器變成一個導入庫(.lib文件的一種形式),然後該靜態庫可以被其他面向窗口的工具使用。

更改您的鏈接線是這樣的:

$(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包含空格或類似字符,請期待混淆。

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

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

+0

MAGNIFICENT!非常感謝你@伊恩!我將新的Makefile的副本添加到問題中。 –