跨平台数据文件访问

标签 c autotools

我想要分发一个数据文件和一个用 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/

相关文章:

c - C 语言中的 Shell

c - 以什么顺序调用 autotools 来创建构建系统?

linux - 如何在 git 包上运行 ./configure 脚本?

c++ - Makefile 无法链接 C++ 编写的共享库 .la

c - 通过指针的二维数组

复杂的C转换解释

c - 一旦五个偶数放入数组中,程序将停止

autotools - Libtool 缓慢,双重构建?

c++ - 检查 C++ 编译器的存在

c - 如果 memcpy 实际上不返回任何内容,如何以 memcpy 作为第一个参数调用 memset?