从 Linux 共享库访问数据文件的首选方法

问题描述 投票:0回答:1

我正在尝试将开源程序构建到要安装在我的计算机上的库中。它基本上是一些物理模拟的数学库。我希望能够链接它,就像它是任何普通的分发库一样。我以前做过这件事,并尝试以或多或少正确的方式来做这件事,这样我的目录中就不会有 root 拥有的随机文件。我的意思是,我按照here指定的方式构建共享库,并将它们打包并使用分发包管理器(Pacman)安装该包。

我现在要安装的软件包括计算中使用的数据文件(基本上是一系列的系数)。发送的示例程序仅读取当前目录中的这些系数,并且可以在源文件中修改该路径。但我的问题是,安装后路径将位于“/usr/local/lib/”之类的位置,这取决于我如何安装此数据文件。需要注意的是,我总是将自己的程序、库和标头安装在“/usr/local/”下,如果合适的话。

这对我来说似乎是一个愚蠢的问题,但是有没有更好的方法来定义该数据文件所在的路径?我认为必须有一种干净的方法来执行此操作,因为某些库带有自己的目录以及附加的可执行文件和数据文件。例如,Xorg 库位于“/usr/lib/Xorg”,并且还有一个目录“/usr/lib/xorg/”,其中包含一个文件“/usr/lib/xorg/protocols.txt”。就像它可能被用来做某事一样。显然,Xorg 开发人员实际上并不是在“/usr/lib/”中进行开发,因此应该有一些可以设置的简单变量。另外,虽然对于 X 来说这会很奇怪,但对于其他库来说,它可能可以安装在“/usr/local/”下,而不是直接安装在“/usr/”下。这就是我尝试这样做的原因,从根本上来说,如果我喜欢它的工作方式,我应该能够将其作为候选包提交到发行版,但在这种情况下它不应该在“本地”下。

我总是可以将数据作为字符串或类似的东西嵌入到程序中,我只是想看看我是否能找出正确的方法来做到这一点,程序可以更新为新的系数而无需重新编译。如果不清楚,请告诉我。

linux shared-libraries
1个回答
0
投票

在这一点上,我能找到的最有弹性的方法是:

#ifndef INSTALLATION_PREFIX
#define INSTALLATION_PREFIX "./"
#endif

#define DATA_FILE_NAME = "mydatafile.txt"

const char * datafilefullpath = INSTALLATION_PREFIX DATA_FILE_NAME;

FILE * datafile = fopen(datafilefullpath, "r");

INSTALLATION_PREFIX
宏可以设置为构建的配置参数。这允许在开发期间在源目录(或其某些子目录,例如“./build”或其他目录)中进行构建,并且还可以针对各种最终系统安装位置进行构建,例如“/usr/lib/”或“/usr /local/lib”或其他任何内容。显然,这些信息可以在构建脚本的其他地方使用,例如在
make install
配方中。

请注意,我在这里在 C 编译器级别使用并置字符串的串联。

我会把这个问题留一两天,看看其他人是否有更好的答案。否则,我会接受我自己的。

© www.soinside.com 2019 - 2024. All rights reserved.