Ошибка "cannot load library (error 126)" при использовании библиотеки

 

День добрый сообществу.

Имеется проблема с разработкой DLL для подключения к МТ4. К сожалению, поиск решений в интернете и на этом форуме результатов не дал. Надеюсь на вашу помощь.

Суть задачи: Пишу DLL для коммуникации с базой данных PostgreSQL.

Проблема: При сборке библиотеки с подключенными либами Postgres-а, в МТ4 при использовании получаю ошибку: cannot load library 'Mt4PostgressBridge.dll' (error 126).

Исходники

 Mt4PostgressBridge.def

LIBRARY Mt4PostgressBridge

EXPORTS Test

Mt4PostgressBridge.cpp

#include <libpq-fe.h>

#define MT4_EXPFUNC __declspec(dllexport)

MT4_EXPFUNC int __stdcall Test()
{

  PGconn *conn = NULL;
  conn = PQconnectdb("user=test password=testpass dbname=testdb hostaddr=192.168.0.155 port=5432");

  return 123;
}

 StdAfx.cpp

#pragma once

Конфигурация:

Собираю с помощью Visual C++ 2010, хостовая ОС Windows 7.

1. def-файл подключил в Linker->Input->Module Definition File (указал полный путь).

2. Хедеры Postgres подключил в C/C++->General->Additional Include Directories (указал полный путь).

3. Либы  Postgres подключил в Linker->General->Additional Library Directories (указал полный путь).

4. Основную либу Postgres указал в зависимостях: Linker->Input->Additional Dependencies (указал в конце списка, после точки с запятой, просто название).

5. Изменил C/C++->Code Generation->Runtime Library на Multi-threaded (/MT).

Скрины конфигурации:

Советник:

#property copyright "Bogdan Ivaniuk"
#property link      ""
#import "Mt4PostgressBridge.dll"
int Test();
#import

int init()
{
  return(0);
}

int deinit()
{
  return(0);
}

int start()
{
  Print(Test());
  return(0);
}

Библиотеку копирую сюда: Terminal_folder\experts\libraries\

Также накопировал туда все Postgres-овские библиотеки (с каталога bin).

Еще прогонял библиотеку  Dependency Walker-ом. Он ругнулся на 3 библиотеки, я их скачал и положил в тот же каталог (Terminal_folder\experts\libraries\). Не помогло.

Если в коде закомментировать строку использования подключенных либ Postrgres-а:

conn = PQconnectdb("user=test password=testpass dbname=testdb hostaddr=192.168.0.155 port=5432");

 то библиотека подключается нормально и функция возвращает корректный int-овый ответ.

Если что, пробовал запускать МТ4 от обычного пользователя и от администратора (правый клик->Run as administrator) 

Подскажите, пожалуйста, что делаю неправильно. Спасибо.

 

В принципе, статическая или динамическая линковка - для меня не принципиально. Накопировать библиотек не проблематично. Лишь бы работало.

Еще пробовал использовать другие библиотеки для доступа к базе (в частности, SQLAPI). Ситуация не изменилась. Как только начинаю использовать посторонний код - получаю ошибку. 

 

Для начала, имхо, слинковать статически, чтобы на 100% избавиться от проблемы депенденсов. Dependency Walker может не на все ругаться.

Если не поможет, попробуйте подключить эту либу\дллку к своему внешнему проекту, проще будет отловить проблему.

 
TheXpert:

Для начала, имхо, слинковать статически, чтобы на 100% избавиться от проблемы депенденсов. Dependency Walker может не на все ругаться.

Если не поможет, попробуйте подключить эту либу\дллку к своему внешнему проекту, проще будет отловить проблему.

Спасибо за быстрый ответ.

Слинковать статически, в смысле сделать Static Library? То есть, *.lib файл?


 
searcher:

Слинковать статически, в смысле сделать Static Library? То есть, *.lib файл?

Сорри, неправильно выразился. Если есть возможность, все зависимости сделать либами а не дллками, да.
 
TheXpert:
Сорри, неправильно выразился. Если есть возможность, все зависимости сделать либами а не дллками, да.


В принципе, явно я подключаю только lib-файлы: 

Основную либу Postgres (libpq.lib) указал в зависимостях: Linker->Input->Additional Dependencies (указал в конце списка, после точки с запятой, просто название). 

А вот какие либы оно использует из PostgreSQL\9.2\lib я даже не знаю (там есть и *.lib и *.dll). Я просто подключил каталог с либами Postgres в Linker->General->Additional Library Directories (указал полный путь). 

 

Не, это не то.

126 может быть если при загрузке не получается найти длл, от которых зависит та дллка которую вы подгружаете.

Например если у вас динамическая линковка, может понадобиться рантаймовская дллка

 
TheXpert:

Не, это не то.

126 может быть если при загрузке не получается найти длл, от которых зависит та дллка которую вы подгружаете. 


А можно собрать библиотеку со статической линковкой, если я использую посторонние DLL? Хотя, я лично так и не понял какие именно либы (или DLL) используются. В cpp-файле, по факту, подключается только хедер.

Например если у вас динамическая линковка, может понадобиться рантаймовская дллка 

Я правильно понимаю, что эти библиотеки стоит положить вместе с моей библиотекой в каталог Terminal_folder\experts\libraries\?
 

Короче проверьте зависимости дллки, битность, нормальность def файла, если нет, то

Если не поможет, попробуйте подключить эту либу\дллку к своему внешнему проекту, проще будет отловить проблему.

 
TheXpert:

Короче проверьте зависимости дллки, битность, нормальность def файла, если нет, то ....



А как можно проверить зависимости кроме как с помощью Dependency Walker?

Битность библиотек правильная, def файл перепроверял. Все ок вроде. Да и в случае если функция не связана с внешними либами, она успешно работает при подключении к МТ4. Я так понимаю, это может свидетельствовать о корректности def-файла. 

 

Есть следующие вопросы, которые могли бы здорово прояснить ситуацию. Буду благодарен за помощь.

1. На сколько я понял, в настройках моего проекта указана статическая линковка (Runtime Library: Multi-threaded (/MT)). Однако, не понятно как определить используемые либы и можно ли с ними линковаться статически.

2. Как можно убедиться, что библиотека правильно слинкована статически? У нее пропадают зависимости если щупать ее Dependency Walker-ом?

3. Если говорить о динамической линковке, то используемые DLL моей DLL тоже стоит помещать в каталог Terminal_folder\experts\libraries\?

4. Зависимости смотреть только Dependency Walker-ом? Если он ругается на библиотеку, скачивать ее и класть в тот же каталог где и основная DLL-ка? Другие библиотеки не давать ему?

А я пока попробую экспериментировать с внешним проектом. Так действительно должно быть проще.