Я пытаюсь использовать библиотеку oracle oci с компилятором mingw64.
Если я связываю oci.lib, предоставленный oracle, моя 64-битная программа вылетает, потому что, очевидно, mingw64 не поддерживает связывание с dll, созданным с помощью vc.
Обходной путь для этого, кажется,:
1) создать файл def из файла oci.dll, что я делаю с mingw64 gendef (если я использую эту команду «dlltool -z oci.def —export-all-symbol oci.dll», я получаю пустой файл def, в то время как, если я использую gendef, я получаю заполненный файл определения)
2) создать библиотеку импорта oci.a с помощью dlltool («dlltool -d oci.def -l liboci.a»)
однако библиотека oci.a, которую я создаю с помощью dlltool, является пустым файлом. В других работах кажется, что я не могу создать эту библиотеку oci.a, которую я должен использовать, чтобы связать свою программу с oci.dll
Кто-нибудь знает, как решить эту проблему?
Кто-то может правильно выполнить эту задачу?
Спасибо
Marco
Я только что сгенерировал liboci.a
без проблем. Возможно, вы что-то напутали или использовали неверный подход (dlltool -z ...
). Вот как вы это делаете:
Скачать и установить (можно собрать из исходного кода) gendef
полезность:
Бежать gendef oci.dll
(будет генерировать oci.def
);
Бежать dlltool -D oci.dll -d oci.def -l liboci.a
(будет генерировать liboci.a
);
Теперь попробуйте связать с liboci.a
,
НОТА: Пожалуйста, убедитесь, что если ваш oci.dll
нацелен на x86, то dlltool
должен быть из дистрибутива MinGW / MinGW-w64, который также нацелен на x86. То же самое касается случая x64, то есть важно, чтобы целевые архитектуры соответствовали.
Этот пост может не относиться к 64-битным системам, насколько я знаю, но он работает на 32-битной Windows …
Я попытался GENDEF, и он не смог создать файл DEF. Я уже решил эту проблему в своих собственных целях, чтобы начать писать DLL, и предлагаю использовать Tiny_impdef.exe из TCC, который работает. (TCC = Tiny C Compiler, Фабрис Беллард, а затем Гришка.) Более того, в отличие от DLLTOOL (и, возможно, GENDEF), он работает независимо от того, использовал ли GCC -s для удаления выходной DLL или нет!
Используйте DLLTOOL для создания файла библиотеки * .a из DEF, если используется GCC. TCC выполнит полную сборку DLL и EXE, используя всего две командной строки. У меня есть набор команд, которые позволят GCC или TCC собирать либо DLL, либо EXE, со всеми четырьмя возможными комбинациями.
Пакетный файл ниже, для хищения по желанию … Я уверен, что это может быть улучшено, но, по крайней мере, он работает чисто как есть.
@ECHO OFF
REM Эта система, кажется, работает независимо от того, какой компилятор создает DLL или EXE. Попробуйте упростить для GCC.REM TCC КОМАНДЫ. Создает 3 файла, DLL и DEF, затем EXE.
REM E: \ CODING \ TCC \ TCC.EXE — общий E: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_DLL.c -oE: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_DLL.dll
REM E: \ CODING \ TCC \ TCC.EXE E: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_EXE.c E: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_DLL.def -oE: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_DLL.exeREM GCC КОМАНДЫ. ПРЕДУПРЕЖДЕНИЕ! Все еще нужен Tiny’s Tiny_Impdef.exe!
E: \ CODING \ GCC \ BIN \ GCC.EXE -s -shared -IE: \ CODING \ GCC \ INCLUDE -mwindows E: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_DLL.c -oE: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_DLL.dll
E: \ CODING \ TCC \ «Tiny_Impdef.exe» E: \ CODING \ TCC \ EXAMPLES \ TEST_DLL \ TEST_DLL.DLL> NUL
E: \ CODING \ GCC \ MINGW32 \ BIN \ DLLTOOL.EXE -d E: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_DLL.def -lE: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ libTest_DLL.a
E: \ CODING \ GCC \ BIN \ GCC.EXE -s -IE: \ CODING \ GCC \ INCLUDE -mwindows E: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_EXE.c E: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ libTest_DLL.a -oE: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_DLL.exeНАЧАТЬ E: \ CODING \ TCC \ EXAMPLES \ Test_DLL \ Test_DLL.exe
#include <windows.h>
#define DLL_EXPORT __declspec(dllexport)
DLL_EXPORT void ZoodleWurdle(){
MessageBox (0, "Wurdle", "Zoodle", MB_ICONINFORMATION);
}
DLL_EXPORT void MangleWurzel(){
MessageBox (0, "Mangled", "Wurzels", MB_ICONINFORMATION);
}
Извините за Gummidgisms, но я должен был начать где-нибудь, и я никогда не любил foo и bar, или привет и мир … Вот EXE:
#include <windows.h>
void ZoodleWurdle();
void MangleWurzel();
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ZoodleWurdle(); MangleWurzel();
return 0;
}