В OpenSuse 11.2 я успешно скомпилировал, связал и выполнил следующий код, который устанавливает источник данных для базы данных MySQL с помощью unixODBC:
#include <iostream>
#include <sql.h>
#include <sqlext.h>
#include <odbcinst.h>
/* Add a data source for the following MySQL db: db=testdb, username=test, password = test. */
void inst()
{
BOOL ret = SQLConfigDataSource(NULL, ODBC_ADD_DSN, "MySQL driver",
"DSN=mysource\0UID=test\0PWD=test\0DATABASE=testdb\0\0");
if (!ret) {
DWORD errCode;
char errBuf[SQL_MAX_MESSAGE_LENGTH];
WORD msgLen;
SQLInstallerError(1, &errCode, errBuf, SQL_MAX_MESSAGE_LENGTH, &msgLen);
std::cerr << errBuf << std::endl;
}
}
int main()
{
inst();
return 0;
}
С тем же кодом в Debian Lenny у меня были проблемы. Во-первых, я скомпилировал этот код следующим образом:
c++ -o main main.cc -lodbc -lodbcinst -L/usr/lib/odbc -lmyodbc
Все прошло нормально. Но когда я попытался запустить результирующий двоичный файл, у меня появилась ошибка компоновщика, которая на самом деле была подтверждена, набрав ldd main:
libmyodbc3_r-3.51.15.so => not found
Хотя я правильно установил unixODBC и связанный с ним MySQL-драйвер (myodbc) на моем хосте (Debian Lenny) самый простой способ (то есть через aptitude), я не смог найти эту общую библиотеку.
Я ошибочно подумал: ну, я создам символическую ссылку на /usr/lib/odbc/libmyodbc.so. В любом случае, теперь моя программа возвращает следующее сообщение:
General installer error
Итак, я чувствую, что файл libmyodbc3_r-3.51.15.so действительно отсутствует.
Примечание. В Debian Lenny версия unixODBC равна 2.2.11, а версия MySQL 5.0.51a
Кто-нибудь когда-либо сталкивался с такой ситуацией? Любая помощь будет оценена.
Опция
-L/usr/lib/odbc
сообщает компилятору, где найти библиотеку для компоновки.
Но система не знает, где найти библиотеку при запуске исполняемого файла.
Вам нужно либо статически ссылаться на libmyodbc, либо сообщить системе, где можно найти библиотеку.
Первое можно сделать, изменив
-lmyodbc
to
-static -lmyodbc
Второе может быть выполнено путем редактирования /etc/ld.so.conf(или добавления в /etc/ld.so.conf.d) и повторного запуска ldconfig или путем установки переменной среды LD_LIBRARY_PATH для включения/usr/Library/ODBC
-Wl,-rpath,/usr/lib/odbc
это, добавив флаг-Wl,-rpath,/usr/lib/odbc