Мне нужно собрать библиотеку 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)/*
Для линкера 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), которые имеют разные библиотеки времени выполнения в одном процессе.
Других решений пока нет …