Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用程序的标准linux“make-install”,链接到正确的libs_Linux_Installation_Makefile - Fatal编程技术网

应用程序的标准linux“make-install”,链接到正确的libs

应用程序的标准linux“make-install”,链接到正确的libs,linux,installation,makefile,Linux,Installation,Makefile,我正在开发一个由大量二进制文件、脚本和lib组成的应用程序。在目前的开发过程中,我已经在我的存储库中构建并运行了: myapp: bin/ include/ lib/ scripts/ src/ Makefile src/包含多个模块(libs或二进制)的代码。每个都有自己的makefile 运行make from myapp/为目标安装目录设置环境变量,然后递归运行make install,它为src/中的每个子模块使用环境变量 这将在myap

我正在开发一个由大量二进制文件、脚本和lib组成的应用程序。在目前的开发过程中,我已经在我的存储库中构建并运行了:

myapp:
    bin/
    include/
    lib/
    scripts/
    src/
    Makefile
src/包含多个模块(libs或二进制)的代码。每个都有自己的makefile

运行make from myapp/为目标安装目录设置环境变量,然后递归运行make install,它为src/中的每个子模块使用环境变量

这将在myapp/的相关子目录中安装二进制文件、include和libs,因为环境变量就是这样设置的

现在我要在系统范围内安装,大概是在/usr/local中。我还对在开发myapp/时保持在本地构建和安装的能力感兴趣。可以方便地在myapp/bin/中运行二进制文件,而无需首先在系统范围内安装它们

我的第一个计划是保留默认的make目标,在myapp下创建可安装二进制文件libs,includes脚本,然后在myapp/Makefile中创建一个新的安装目标,该目标将这些可安装文件复制到/usr/local/sudo中

我的问题是,在开发过程中,二进制文件需要知道libs在哪里。我一直在用-Wl,-rpath=/path/to/myapp/lib链接到myapp/lib中的libs。但是,这不适用于系统安装的二进制文件,它们应该参考/usr/local/lib/

我可以看到几种解决方案,但都不是很好:

使用在/usr/local而不是myapp/中设置的环境变量target directories进行安装重建,而不仅仅是复制。缺点:我认为整个重建过程都需要sudo,而不仅仅是安装。 删除与-Wl,-rpath的链接,改为在开发时将LD_LIBRARY_PATH设置为包含myapp/lib,但不包括其他内容。很明显,这是我的。当我想在系统范围内运行时,我很容易忘记取消设置它,而本地libs将被错误地使用。 删除与-Wl,-rpath的链接,并要求在myapp/中本地构建二进制文件之前在系统范围内安装libs。这很麻烦,我想保留克隆我的回购协议并在本地一步构建的能力。 其他人可能有这个问题,我想知道是否有一个标准的解决方案


,但没有处理我链接libs的问题。

此处可能会用到$ORIGIN rpath值。看见话虽如此,我不认为LD_LIBRARY_PATH是个坏主意,但我建议将它包装在脚本中供开发人员使用,甚至可能是一个实现它的make目标。我相信自动工具可以在树内运行时包装脚本。为什么不创建另一个像dev这样的make目标,它将使用local-rpath执行构建,而默认的make builds用于部署?@EtanReisner:$ORIGIN听起来很有趣!即使安装在/usr/local/*中,它也应该可以工作。我正在重新考虑LD_LIBRARY_PATH,但我担心我经常挠头,试图弄明白为什么我在库中的更改似乎没有任何效果,结果却发现我使用的不是正确的。一个目标怎么能设定呢?它只会为这个make进程设置,如果我导出它,可能会为子进程设置,但不会为调用shell设置。@dekkard:这是可能的。但是我需要重新构建所有的lib和二进制文件进行安装,而不是只构建一次,然后安装我在本地测试的东西。make target的想法是一个rundev或类似的目标,它只是设置/运行脚本,该脚本使用LD_LIBRARY_PATH为开发人员的使用设置东西。是的,$ORIGIN的思想是二进制文件/库可以作为一个单元重新定位。