использовать oracle oci.dll с 64-битным компилятором mingw64

Я пытаюсь использовать библиотеку 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

1

Решение

Я только что сгенерировал liboci.a без проблем. Возможно, вы что-то напутали или использовали неверный подход (dlltool -z ...). Вот как вы это делаете:

  1. Скачать и установить (можно собрать из исходного кода) gendef полезность:

    • Если у вас есть обычный MinGW, затем получить его Вот;
    • Если у вас есть MinGW-w64, затем получить его Вот.
  2. Бежать gendef oci.dll (будет генерировать oci.def);

  3. Бежать dlltool -D oci.dll -d oci.def -l liboci.a (будет генерировать liboci.a);

  4. Теперь попробуйте связать с liboci.a,

НОТА: Пожалуйста, убедитесь, что если ваш oci.dll нацелен на x86, то dlltool должен быть из дистрибутива MinGW / MinGW-w64, который также нацелен на x86. То же самое касается случая x64, то есть важно, чтобы целевые архитектуры соответствовали.

2

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

Этот пост может не относиться к 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.exe

REM 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


Для полноты вот код C для тестовой DLL:

#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;
}
0

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