C++ 如何从makefile在Linux上安装程序?

C++ 如何从makefile在Linux上安装程序?,c++,linux,bash,C++,Linux,Bash,可能重复: 我正在制作一个可以从命令行调用的程序,比如/prog arg1 arg2。我想知道,我如何才能使它,使我可以运行它从任何地方在系统上?我知道我可以将prog放入/usr/bin/,但是如果我的程序需要安装目录中的资源(可以在用户下载它的任何地方)?当您使用prog arg1 arg2执行程序时,这要感谢您的shell,在$PATH环境变量中搜索程序所在的文件夹。(尝试env | grep PATH查看这些文件夹) 您需要在该变量中添加一个新目录(export PATH=“/new/

可能重复:


我正在制作一个可以从命令行调用的程序,比如
/prog arg1 arg2
。我想知道,我如何才能使它,使我可以运行它从任何地方在系统上?我知道我可以将
prog
放入
/usr/bin/
,但是如果我的程序需要安装目录中的资源(可以在用户下载它的任何地方)?

当您使用
prog arg1 arg2
执行程序时,这要感谢您的shell,在$PATH环境变量中搜索程序所在的文件夹。(尝试
env | grep PATH
查看这些文件夹)


您需要在该变量中添加一个新目录(
export PATH=“/new/directory/PATH/:$PATH”
如果在bash下,
setenv PATH”/new/directory/PATH/:$PATH”
如果使用tcsh),或者将您的程序及其需要执行的所有文件复制到其中一个PATH文件夹中。

有两种处理方法(和makefile无关)

  • 你的安装程序可以把文件放在它想要的地方,这样你的程序就不必搜索了——它可以使用硬编码的路径。或者你也可以把数据目录的路径放在另一个文件中,该文件将是硬编码的(比如/etc/programname.config)

  • 您可以将所有内容放在一个目录中(通常类似于/opt/programname)。当然,您也可以硬编码,或者您的程序可以读取/proc/pid/exe文件中的readlink()(但不保证。特别是,如果使用符号链接从/usr/bin/programname指向您的/opt/programname/bin/programname或其他任何内容,则该方法有效,但如果是硬链接,则该方法无效) 获取可执行文件的路径。从那里您应该能够访问数据文件


如果你喜欢第二种解决方案,但那只是我。第一种解决方案与包管理器配合得很好,如果你没有太多的数据文件,那么它就不会太过分了。

将你的程序所在的目录放入
路径
环境变量中,或者将你的程序移动到
路径中已有的一个目录中(通常需要超级用户权限,我想你没有这个权限,那么你就不会问这个问题了)

要将目录添加到搜索路径的前面,并让系统在
tcsh
上刷新其数据库,请执行以下操作:

setenv "my/directory:"$PATH
rehash
bash
上,我认为

PATH=/my/directory:$PATH
export PATH

(无需重新刷新)。请注意,上述命令将您的目录放在搜索路径的顶部,即这些目录将在任何其他目录之前进行搜索。因此,如果您的程序被称为“gcc”,则将执行您的程序,而不是GNU C编译器。或者,您可以将目录添加到搜索路径的末尾,在这种情况下,只有在搜索路径中的任何其他目录中未找到同名的其他程序时,才会拾取您的程序。

您可能还想熟悉以下内容:“何去何从”的标准定义。以下是更多信息:

环境变量可以全局定义(“每个人”,例如
/etc/profile
),也可以局部定义(“每个用户”,例如
~/.bashrc
)。以下是一些选项的良好总结:


这些资源通常放在
/usr/share
下的某个位置。这些资源的位置通常在编译时硬编码到程序中,也就是说,程序是针对特定的安装位置编译的。配置文件等也是如此。