Вы можете использовать dllwrap, если ваш дистрибутив binutils (как нативной, так и кросс-компиляции) обеспечивает это.
Он может создавать библиотеки DLL, используя интерфейс в файле DEF (для этого он вызывает gcc, ld и dlltool). Разница между использованием этого и передачей файла DEF непосредственно в GCC заключается в том, что определения в файле обрабатываются по-разному.
Например, если у вас есть символ переименования в файле экспорта:
_SomeFuntion = _SomeFunction@12
GCC создаст 2 экспорта, один с именем _SomeFunction
, а другой с декорированным именем, в то время как dllwrap будет экспортировать только _SomeFuntion
. Поэтому, если вы добавите в файл DEF только те символы, которые вы хотите экспортировать, то в итоге вы попадете только в библиотеку.
dllwrap по умолчанию использует драйвер компилятора C, так как он не может знать иначе. Когда вы связываете код C ++, вы должны использовать опцию --driver-name c++
для установки драйвера. Если у вас есть исполняемые файлы MinGW с префиксом, вы должны также включить его в имя драйвера (например, i686-mingw32-c++
вместо c++
), и вам может понадобиться использовать опцию --dlltool-name
.
Попробуйте использовать эти две строки вместо той, которую вы опубликовали:
g++ -c CXXFLAGS DEFINES INCLUDES -o library.o library.cpp
dllwrap -o library.dll --driver-name c++ --def DEF_FILE OBJECT_FILES LIBS -Wl,--enable-stdcall-fixup
Первый генерирует объектный файл из кода library.cpp
, а второй собирает динамическую библиотеку. У вещи OBJECT_FILES
(которую я предполагаю, что это другие объектные файлы, сгенерированные вами ранее) тоже должно быть library.o
.
Тем не менее, я должен сказать, что dllwrap уже был устарел в 2006 году, и в официальном пакете binutils нет документации по нему; чтобы получить информацию, вы можете позвонить по номеру --help
как обычно. Он может сгенерировать библиотеку импорта, если она вам тоже понадобится.