我想要分发一个数据文件和一个用 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 中,软件不是以这种方式安装的,所有不同的文件通常都安装到一个目录中。为此,可以在运行configure时将bindir和datadir设置为/,但这会使fopen参数无效。
有什么方法可以调整我的设置,以便程序在不使用 #ifdefs 的情况下引用正确的路径?
最佳答案
您可以在 Windows 上设置 -DDATADIR='.'
以获得所需的行为。您可以使用 configure.ac
检查是否在 Windows 上进行编译。这是一种方法,改编自 GTK source code :
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@
添加到 Makefile.am
中的 myprogram_CPPFLAGS
。
关于跨平台数据文件访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4531887/