Вопрос

Я пытаюсь использовать библиотеку 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, в то время как, если я использую гендеф, я получаю заполненный файл def)

2) Сгенерировать библиотеку импорта OCI.A с dlltool ("dlltool -d oci.def -l liboci.a")

Однако библиотека OCI.A, которую я генерирую с помощью dlltool, является пустым файлом. В других работах кажется, что я не могу генерировать эту библиотеку OCI.A, которую я должен использовать, чтобы связать свою программу с OCI.DLL

Кто -то знает, как решить эту проблему? Кто -то может правильно выполнить эту задачу?

Спасибо

Марко

Это было полезно?

Решение

Я только что сгенерировал 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, то есть важно, чтобы целевые архитектуры совпадали.

Другие советы

Этот пост может не применяться к 64 -битным системам для всего, что я знаю, но он работает на 32 -битных Windows ...

Я попробовал гендеф, и ему не удалось создать файл DEF. Уже решив эту проблему для моих собственных целей в начале писать DLL, я предлагаю использовать tiny_impdef.exe из TCC, который работает. (TCC = Tiny C Compiler, Fabrice Bellard, а затем, Grishka.) Что больше, в отличие от dlltool (и, возможно, гендеф), он работает, использует ли GCC -s для разрыва выходного DLL или нет!

Используйте dlltool для генерации файла библиотеки *.a из DEF, если использует GCC. TCC выполнит всю сборку DLL и EXE, используя всего две командные строки. У меня есть набор команд, которые позволят либо DLL, либо EXE быть построены с помощью GCC или TCC, причем все четыре возможных комбинации работают.

Пакетный файл ниже, для разграбления по желанию ... Я уверен, что это может быть улучшено, но, по крайней мере, он работает чисто, как есть.

@ECHO OFF
REM This system seems to work regardless of which compiler makes the DLL or the EXE. Try to simplify for GCC.

REM TCC Команды. Создает 3 файла, DLL и DEF, затем EXE. REM E: CODING TCC TCC.EXE -Shared E: Кодирование TCC Примеры test_dll test_dll.c -oe: coding tcc Примеры test_dll test_dll.dll rem e: кодирование tcc Tcc.exe e: coding tcc Примеры test_dll test_exe.c e: coding tcc Примеры test_dll test_dll.def -oe: coding tcc Примеры test_dll test_dll.exe

REM GCC Команды. ПРЕДУПРЕЖДЕНИЕ! Все еще нуждается в TCC Tiny_Impdef.exe! E: coding gcc bin gcc.exe -s -shared -ie -ie: coding gcc includ Test_dll test_dll.dll e: coding tcc "tiny_impdef.exe" e: coding tcc Примеры test_dll test_dll.dll> nul e: coding gcc mingw32 bin dlltool.exe -d E: coding tcc Примеры test_dll test_dll.def -le: coding tcc Примеры test_dll libtest_dll.a e: кодирование gcc bin gcc.exe -s -ie: кодирование gcc Include -mwindows e: coding tcc Примеры test_dll test_exe.c e: coding tcc Примеры test_dll libtest_dll.aoe: coding tcc Примеры test_dll test_dll.exe

Start E: Coding TCC Примеры 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top