使用git安装多个版本的软件

时间:2016-06-04 15:46:33

标签: c++ git installation header shared-libraries

我真的很难理解git,所以这里对我之前提出的问题进行了更严格的改写。我将解释一个假设的场景,详细说明我在使用git下载某些代码并将其安装到计算机上时的想法,希望有人可以告诉我哪个部分我不正确!

  1. 我运行git clone git://github.com/foo/foo.git
  2. 这会创建一个本地目录foo,并下载源代码和git数据
  3. 此源代码有效地包含该软件的所有版本:源文件,头文件和不同版本的git数据
  4. 我运行git checkout release-1.0
  5. 这告诉我的系统我想要处理软件的1.0版本
  6. 我运行make,它编译版本1.0的代码
  7. 这会创建一个名为libfoo.so.1
  8. 的库
  9. 我运行安装库的make install
  10. 这会将libfoo.so.1复制到目录/usr/local/lib
  11. 它还会将头文件foo.h复制到目录/usr/local/include
  12. 此头文件是foo.h的版本,对应于软件的版本1.0
  13. 我现在也想安装该软件的第2版,因此我运行git checkout release-2.0
  14. 这告诉我的系统我想要处理软件的2.0版本
  15. 我运行make,它编译版本2.0的代码
  16. 这会创建一个名为libfoo.so.2
  17. 的库
  18. 我运行安装库的make install
  19. 这会将libfoo.so.2复制到目录/usr/local/lib
  20. 它还会将头文件foo.h复制到目录/usr/local/include
  21. 此标头文件是foo.h的版本,对应于软件的版本2.0
  22. 我现在尝试创建一个依赖于该软件2.0版的项目,并将其链接到位于libfoo.so.2的{​​{1}},并包含位于{{1的/usr/local/lib }}
  23. 此项目编译并运行正常
  24. 我现在尝试创建一个依赖于软件版本1.0的项目,并将其链接到位于foo.h的{​​{1}},并包含位于{{1的/usr/local/include }}
  25. 此项目编译正常,因为libfoo.so.1是软件版本2.0的头文件,而不是版本1.0。
  26. 所以,我很困惑的是如何在你的机器上安装两个版本的软件。实际的库文件/usr/local/libfoo.h都已创建,可以通过两个不同的项目链接,但本地计算机上只安装了/usr/local/include的一个版本。因此,只有安装了最新版本的版本才会有正确的头文件,因为这两个版本需要不同版本的foo.h

    请有人解释一下我感到困惑的地方吗?谢谢!

2 个答案:

答案 0 :(得分:1)

你的问题根本与git无关。你会遇到同样的问题,问题的根源是通过安装一个版本,你可以在固定的位置(/usr/lib/foo.h)覆盖相同的文件。如果您希望能够同时使用这两个版本,则必须找到更改它的方法。

答案 1 :(得分:1)

您可以将库的不同版本安装到不同的目录中,以便安装的第二个版本不会覆盖第一个版本的文件。通常,您可以在运行./configure --prefix=/opt/foo-v1 make make install 脚本时指定安装前缀。

例如,对于版本1,您可以运行:

libfoo.so.1

/opt/foo-v1/lib将安装在foo.h中,/opt/foo-v1/include(适用于版本1)将安装在./configure --prefix=/opt/foo-v2 make make install 中。

同样,对于版本2,您可以运行:

libfoo.so.2

/opt/foo-v2/lib将安装在foo.h中,/opt/foo-v2/include(适用于版本2)将安装在clang++ -I/opt/foo-v1/include -L/opt/foo-v1/lib -lfoo program1.cc 中。

现在,当您编译依赖于库的版本1的程序时,您可以为版本1指定适当的头和库路径:

clang++ -I/opt/foo-v2/include -L/opt/foo-v2/lib -lfoo program2.cc

同样,对于版本2:

README

请注意,指定安装前缀的确切过程因项目而异,具体取决于所使用的构建工具。通常,会有一个INSTALL和/或{{1}}文件来记录相关项目的过程。