Типичным объявлением переменной является
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)
Другие примеры несоответствий включают
Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.
Пример кода:
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: невозможно открыть файл общих объектов: нет такого файла или каталога
blockquote>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
Разрешить:
export ODBCINI=/etc/odbc.ini
(если вы использовали драйвер odbc)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.