Межплатформенный доступ к файлам данных - PullRequest
0 голосов
/ 26 декабря 2010

Я хочу распространять как файл данных, так и программу, написанную на C, которая открывает файл данных, а затем закрывает его и делает его переносимым.Исходный код программы будет выглядеть примерно так:

#include <stdio.h>

int main(int argc, char** argv)
{
    fclose(fopen("data.dat", "rb"));

    return 0;
}

Я также использую Autotools:

$ ls -R
.:
configure.ac
dat
Makefile.am
src

./dat:
data.dat
Makefile.am

./src:
hello.c
Makefile.am

В Linux при установке программного обеспечения файлы обычно идут в определенные каталоги, например, helloПерейдите в / usr / local / bin, а data.dat будет в / usr / local / share, и установщик может настроить эти каталоги.Поэтому программу необходимо будет адаптировать к изменению пути к файлу данных, в частности к переменной datadir.

#src/Makefile.am
AM_CPPFLAGS=-DDATADIR='"$(datadir)"'
 ...

.

//src/hello.c
 ...
    fclose(fopen(DATADIR "/data.dat", "rb+"));
 ...

Однако в Windows программное обеспечение неустанавливается таким образом, и все различные файлы обычно устанавливаются в один каталог.Чтобы сделать это, bindir и datadir могут быть выполнены для / при запуске configure, однако это сделает аргумент fopen недействительным.

Есть ли способ настроить мои настройки так, чтобы программа ссылалась на правильный путьбез использования #ifdefs?

1 Ответ

2 голосов
/ 26 декабря 2010

Вы можете установить -DDATADIR='.' в Windows, чтобы получить желаемое поведение.Вы можете использовать configure.ac, чтобы проверить, компилируете ли вы в Windows.Вот один из способов сделать это, адаптированный из исходного кода GTK :

AC_CANONICAL_HOST
AC_MSG_CHECKING([for native Win32])
case "$host" in
  *-*-mingw*)
    os_win32=yes
    ;;
  *)
    os_win32=no
    ;;
esac
AC_MSG_RESULT([$os_win32])

if test "$os_win32" = "yes"; then
    DATADEF='-DDATADIR=.'
else
    DATADEF="-DDATADIR=$daatadir"
fi
AC_SUBST(DATADEF)

Затем добавьте @DATADEF@ к вашему myprogram_CPPFLAGS в Makefile.am.

...