c++ - 如何使用 gfortran 使用我的 .dll 构建 .lib 文件?

标签 c++ visual-studio dll fortran msys2

我需要在 Windows 上使用 gfortran 构建一个 FORTRAN DLL,以便它可以被 C++ 和 Visual Studio 2013 调用。

我有一个使用 MSYS2 构建的示例 DLL,但我不知道如何为 Visual Studio 获取 LIB 文件。

在线搜索的主要结果是关于如何使用 Visual Studio 制作 LIB 文件,以及如何仅从 DLL 和头文件创建 LIB 文件。但我不想做后者涉及的讨厌的事情,而且我认为我不需要这样做,因为我是构建 DLL 的人。我只想构建 DLL 并使用它获取我的 LIB 文件。

一个异常(exception)是 this SO question ,但是我不清楚答案。看起来他正在做的事情与我发现的在 DLL 已经存在后创建 LIB 文件的其他解决方案类似……但我不敢相信这是最佳解决方案。

我对事后创建它不满意的部分原因是我想将它放入一个过程中,以便其他开发人员可以在我之后使用代码——这不仅仅是一次性构建那类的东西。我不想给他们一份复杂的说明 list 。

您知道如何执行此操作或对如何执行此操作有任何建议吗?

这是我写得不好的示例 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 包含空格或类似内容,预计会造成混淆。

然后可以将静态库提供给 cl.exe Microsoft 编译器驱动程序的调用。

请注意,在一个进程中使用具有不同运行时库的可执行模块(DLL、EXE)时需要特别小心。

关于c++ - 如何使用 gfortran 使用我的 .dll 构建 .lib 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39959648/

相关文章:

c# - 使用带有 c dll 的后台工作程序

c# - 在 .dll 文件和 .cs 上运行 Fortify

c++ - 如何将 void(*)() 类型的指针转​​换为 void*

visual-studio - 从 Visual Studio 搜索中排除特定文件

visual-studio - TFS 2010 Web 访问构建摘要中缺少 "View Test Results"?

visual-studio - 是否有标准键盘快捷键可以在 Visual Studio 中构建当前项目?

c++ - Makefile:在全局变量初始化之前通过 'make all' 命令运行 bash 脚本

c++ - 在 Win32 上处理 CTRL+C

c++ - 为什么我必须将原始图像数据的宽度除以 3?

java - 如何从cmd启动使用预编译DLL的java swing应用程序?