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

Я пытаюсь использовать библиотеку oracle oci с компилятором mingw64. Если я свяжу oci.lib, предоставленный оракулом, моя 64-битная программа выйдет из строя, потому что, по-видимому, mingw64 не поддерживает связывание с dll, созданным с помощью vc.

Обходной путь для этого выглядит следующим образом:

1) сгенерировать файл def из oci.dll, что я делаю с помощью mingw64 gendef (если я использую эту команду «dlltool -z oci.def --export-all-symbol oci.dll», я получаю пустой файл def, в то время как если я использую gendef, я получаю заполненный файл def)

2) создать библиотеку импорта oci.a с помощью dlltool ("dlltool -d oci.def -l liboci.a")

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

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

Спасибо

Марко


person Marco    schedule 08.11.2013    source источник


Ответы (2)


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

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

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

person Alexander Shukaev    schedule 20.11.2013
comment
Проблема с oraocci12.dll. gendef oraocci12.dll не генерирует def-файл, но содержит много ошибок decode_ms_name. Поэтому я не могу связать этот файл с mingw64 и получить неопределенную ссылку на oracle occi::oracle:environment. Любые идеи? - person Kotodid; 25.12.2014

Насколько я знаю, этот пост может не относиться к 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, используя всего две командные строки. У меня есть набор команд, которые позволяют создавать 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:\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. ПРЕДУПРЕЖДЕНИЕ! Все еще нужен TCC 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);
}

Извините за гуммиджизмы, но мне нужно было с чего-то начинать, и мне никогда не нравились foo и bar или hello и world... Вот EXE:

#include <windows.h>
void ZoodleWurdle();
void MangleWurzel();

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
  ZoodleWurdle(); MangleWurzel();
  return 0;
}
person Community    schedule 05.11.2016