Как мне создать файл .lib с моим .dll, используя gfortran?

Мне нужно собрать библиотеку FORTRAN в Windows, используя gfortran, чтобы она вызывалась C ++ с Visual Studio 2013.

У меня есть пример библиотеки DLL с MSYS2, но я не могу понять, как получить файл LIB для Visual Studio.

Поиск в Интернете дал в основном результаты о том, как создать файл LIB с помощью Visual Studio, и как создать файл LIB только из DLL и файла заголовка. Но я не хочу делать неприятные вещи, связанные с последним, и я не думаю, что мне это нужно, так как именно я создаю DLL. Я просто хочу собрать DLL и получить с ней мой LIB-файл.

Одно исключение этот ТАК вопрос, однако ответ мне не ясен. Похоже, он делает нечто похожее на другие решения, которые я нашел для создания файла LIB после того, как DLL уже существует … но я не могу поверить, что это оптимальное решение.

Одна из причин, по которой я не удовлетворен созданием этого после того, как он возник, заключается в том, что я хочу поместить это в процесс, чтобы другие разработчики могли использовать код после меня — это не просто что-то одноразовое , Я не хочу давать им список сложных инструкций.

Вы знаете, как это сделать, или у вас есть предложения, как это сделать?

Вот мой плохо написанный пример 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)/*

0

Решение

Для линкера gcc может быть задан вывод файла определения модуля (расширение .def), в котором описывается весь экспорт из DLL.

Затем этот файл def может быть преобразован в библиотеку импорта (в виде файла .lib) с помощью диспетчера библиотек Microsoft, а затем эта статическая библиотека может использоваться другими инструментами, ориентированными на 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), которые имеют разные библиотеки времени выполнения в одном процессе.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]