Как можно решить это ?: Проблемы с загрузкой исходной библиотеки / отсутствующие методы: no ttJdbcCS в java.library.path [duplicate]

Объявлено, но не определено переменная или функция.

Типичным объявлением переменной является

extern int x;

. Поскольку это только объявление, требуется одно определение. Соответствующим определением будет:

int x;

Например, следующее генерирует ошибку:

extern int x;
int main()
{
    x = 0;
}
//int x; // uncomment this line for successful definition

Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:

void foo(); // declaration only
int main()
{
   foo();
}
//void foo() {} //uncomment this line for successful definition

Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы объявили. Например, у вас могут быть несогласованные cv-квалификаторы:

void foo(int& x);
int main()
{
   int x;
   foo(x);
}
void foo(const int& x) {} //different function, doesn't provide a definition
                          //for void foo(int& x)

Другие примеры несоответствий включают

  • Функция / переменная, объявленная в одном пространстве имен, определенное в другом.
  • Функция / переменная, объявленная как член класса, определяемая как глобальная (или наоборот).
  • Тип возвращаемого значения функции, номер и типы параметров и соглашение о вызове не совсем точно согласуются.

Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.

-1
задан George Brighton 13 November 2013 в 11:27
поделиться

1 ответ

Пример кода:

try{        
     String driverName =  "com.timesten.jdbc.TimesTenClientDriver"; // "sun.jdbc.odbc.JdbcOdbcDriver"
      String Url = "jdbc:timesten:client:dsn=timestendb_1122"; //"jdbc:odbc:timestendb_1122";   

       if(args.length >= 2){
                 driverName = args[0]; 
                 Url = args[1];
        }           

        System.out.println("driverName=" + driverName);
        System.out.println("Url=" + Url);
        System.out.println("classPath=" + System.getProperty("java.library.path"));     

            Class.forName(driverName).newInstance();

              // Open a connection to TimesTen
            Connection conn = DriverManager.getConnection(Url);        

            if(conn != null){
                System.out.println("okay");
            }
            else{
                 System.out.println("fail");
            }
                conn.close();
} catch (SQLException e) {
        e.printStackTrace();
}

odbc.ini config:

[ODBC Data Sources]
timestendb_11221=TimesTen 11.2.2 Driver

[timestendb_1122]
TTC_SERVER=(Host || IP)
UID=Username
PWD=Password
TTC_SERVER_DSN=Cachedb01

Ошибка: java.sql.SQLException: проблемы с загрузкой исходной библиотеки / отсутствующие методы : /opt/TimesTen/tt1122/lib/libttJdbcCS.so: libttclient.so: невозможно открыть файл общих объектов: нет такого файла или каталога

Resolve:

Check если существует:

$ldd /opt/TimesTen/tt1122/lib/libttJdbcCS.so

Экран:

linux-vdso.so.1 =>  (0x00007fff039b4000)
    libttclient.so => not found
    libttco.so => not found
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f57d642e000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f57d6218000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57d5e58000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57d5c53000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f57d6876000)

Проверить каталог timesten client: $ ll /opt/TimesTen/tt1122/lib/libttclient.so

Перейти к файлу для добавления share lib: sudo vi /etc/ld.so.conf.d/extension.conf -> Добавить: /opt/TimesTen/tt1122/lib

Проверить снова

java -Djava.library.path=/opt/TimesTen/tt1122/lib -jar test1.jar 

Печать кода:

driverName=com.timesten.jdbc.TimesTenClientDriver
Url=jdbc:timesten:client:dsn=timestendb_1122
classPath=/opt/TimesTen/tt1122/lib
java.sql.SQLException: [TimesTen][TimesTen 11.2.2.5.0 CLIENT]Cannot find the requested DSN (timestendb_1122) in ODBCINI, Unable to open /var/TimesTen/tt1122/sys.odbc.ini. Permission denied

Разрешить:

  1. export ODBCINI=/etc/odbc.ini (если вы использовали драйвер odbc)
  2. export ODBCINI=/var/TimesTen/tt1122/sys.odbc.ini (если используется драйвер timesten)

Можно добавить файл bash для пользователя:

nano /home/nhatvd/.bashrc 
export ODBCINI=/etc/odbc.ini

$ ldd /opt/TimesTen/tt1122/lib/libttJdbcCS.so

    linux-vdso.so.1 =>  (0x00007fff429fe000)
    libttclient.so => /opt/TimesTen/tt1122/lib/libttclient.so (0x00007fd7977ee000)
    libttco.so => /opt/TimesTen/tt1122/lib/libttco.so (0x00007fd797520000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd797223000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd79700d000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd796c4d000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd796a48000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd796748000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd79652b000)
    libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007fd796310000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fd797b12000)

Результат:

$ java -Djava.library.path=/opt/TimesTen/tt1122/lib -jar test1.jar 

Печать кода:

driverName=com.timesten.jdbc.TimesTenClientDriver
Url=jdbc:timesten:client:dsn=timestendb_1122
classPath=/opt/TimesTen/tt1122/lib

okay

DONE.

2
ответ дан Mark Rotteveel 26 August 2018 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: