LINUX.ORG.RU

Странное поведение "../" в пути к файлу.


0

0

Вообщем странная фигня возникла. Разрабатываю проект в KDevelop, в моей проге юзается конфиг файл и файл темы. Путь к первому прописан явно, т.е. /etc/ldm/ldm.conf а путь к конфигу темы не явно, т.е. ../share/ldm/themes/default/theme.conf. Так вот, оба файла открываются и нормально читаются, если бинарник запущен из KDevelop'а ( Shift+f9 ), а если его скопировать в /usr/bin то конфигурационный файл открывается а вот файл темы не хочет, узнаю об этом по сообщению, которое я забил в код для проверки наличия файла и последующему сегфолту. При этом как я уже сказал из КДевелопа всё работает. Файл темы лежит в /usr/share/ldm/themes/default/theme.conf а в проекте, покольку бинарник кладётся в debug/src/ldm, в debug/share/....


void ldm::getConfig ( )
{
file_conf = new QString ( "/etc/ldm/ldm.conf" );

QFile *conf_file = new QFile ( *file_conf );
if ( !conf_file->open ( IO_ReadOnly ) )
{
QMessageBox::information( this, "LDM",
"Unable to find the configuration file.\n"
"The factory default will be used instead." );

file_passwd = new QString ( "/etc/passwd" );
file_theme = new QString ( "../share/ldm/themes/default/theme.conf" );
}
else
{
QStringList conf = loadFile ( *file_conf );
file_passwd = new QString ( getPasswdFilePath ( conf[1] ) );
theme_name = getThemeName ( conf[2] );
file_theme = new QString ( "../share/ldm/themes/" + theme_name + "/" + "theme.conf" );
//file_theme = new QString ( "/usr/share/ldm/themes/default/theme.conf" );
}
conf_file->close ( );
delete file_conf;
delete conf_file;
}

void ldm::getTheme ( )
{
QFile *theme_file = new QFile ( *file_theme );
if ( !theme_file->open ( IO_ReadOnly ) )
{
QMessageBox::information( this, "LDM",
"Unable to find the theme file.\n"
"The factory default will be used instead." );

file_img_background = new QString ( "../share/ldm/themes/default/b.png" );
}
else
{
QStringList theme = loadFile ( *file_theme );
file_img_background = new QString ( "../share/ldm/themes/" + theme_name + "/" +
getBackgndImg ( theme[1] ) );
}
theme_file->close ( );
delete file_theme;
delete theme_file;
}



Может кто подскажет почему двоеточие не работает в системе а работает только в среде разработки.

Заранее спасибо!!!

★★★★★

Есть подозрение, что текущим у тебя будет тот каталог, в котором ты находишся, а не /usr/bin, а запущенная программа от shell'а унаследует текущий каталог, и естественно, у тебя будет ../ указывать не в /usr.

Spectr ★★★
()
Ответ на: комментарий от Dead

Запуск идёт от туда где я нахожусь по дефолту, либо где я был до этого, но не в /usr/bin ( короче куда кинет баш и konsole ). Т.е. бинарник запускаю находясь там где меня нет ( в /usr/bin ) простой командой ldm и всё.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Может, использовать getcwd()? [Ay49]Mihas

anonymous
()
Ответ на: комментарий от cyclon

Если перейти в /usr/bin то всё пучком. Отсюда вопрос какой фнкцией можно сменить текущий калог.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Встал другой вопрос, а как сделать привязку к prefix, т.е. что бы делать chdir в католог куда установлена программа.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Через дефайн (-DPREFIX=/usr/) при компиляции передавать не катит?
а потом в коде все имена файлов считать как PREFIX+имя файла

Dead ★★★★
()
Ответ на: комментарий от anonymous

Фак неплохой, но...

1. В arg[0] пути нет. 2. Куда именно добовлять обьявление и как оно должно выглядеть. Там написано что в конфигуратор ./configure'а я так понял в configure.in , но как именно.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

>Там написано что в конфигуратор ./configure'а я так понял в configure.in , но как именно.

Элементарно добавляется Просто читаешь доку по autoconf. Благо она имеется в разделе документации на русском языке. Плюс смотреть примеры, благо их хватает.

Dead ★★★★
()
Ответ на: комментарий от cyclon

>1. В arg[0] пути нет

Странно, а вроде должен быть. Если я правильно понял проблему, то ее решение заключается в том чтобы при запуске программы установить текущий каталог на каталог с ее местом расположения. Подобную проблему я решал именно с помощью arg[0] (!!!???). То есть в main использовался QDir для установки текущего каталога который QRegExp (кажется так он называется) парсился из arg[0].

KIV
()
Ответ на: комментарий от KIV

> Странно, а вроде должен быть. Если я правильно понял проблему, то ее решение заключается в том чтобы при запуске программы установить текущий каталог на каталог с ее местом расположения. Подобную проблему я решал именно с помощью arg[0] (!!!???). То есть в main использовался QDir для установки текущего каталога который QRegExp (кажется так он называется) парсился из arg[0].

Да неа ты не понял, текущий каталог мне знать не нужно, т.е. текущий каталог пользователя, а каталог где лежит прога.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

> Элементарно добавляется Просто читаешь доку по autoconf. Благо она имеется в разделе документации на русском языке. Плюс смотреть примеры, благо их хватает.

А где, я смотрел доки на лоре но чё то не нашёл, может плохо искал. Подкинь сссылочку, буду признателен.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Короче как там всё пространно, может всё же покажешь как это должно выглядеть, А! А то впринципе прога готова (альфа, но всё же), а вот этом префиксе вся загвоздка.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

ГЫ: Нашёл элегантное решение проблемы...

Спасибо всем кто пытался помочь.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

1. в configure.in если еще не добалено добавить 
AM_CONFIG_HEADER(config.h)

2. в configure.in добавить
AC_DEFINE_UNQUOTED(PREFIX, "$prefix", [Install prefix])

3. запустить как обычно
aclocal
autoconf
automake
autoheader

4. Проверить наличие в config.h макроса PREFIX

5. Подключить в своей программе
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif


6. ИСпользовать дефайн PREFIX по своему усмотрению


Dead ★★★★
()

Тогда проще не мудиться а сделать так:

1. В каталог /usr/bin кидаешь свою прогу под названием idm.exe :) 2. В /usr/bin кидаешь скрипт idm содержащий: #!/bin/sh `cd /usr/bin; ./idm.exe`

и все! :) Можно это прибарабанить к make install c prefix-ом.

ЗЫ. Лучше всего всетаки ИМНО свои проги инсталить куданибудь в /usr/local/xxx а в /usr/bin складывать или ссылки или скрипты запуска

KIV
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.