【问题标题】:Installing multiple versions of software with git使用 git 安装多个版本的软件
【发布时间】:2016-06-04 15:46:33
【问题描述】:

我真的很难理解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. 我运行 make install,它会安装库
  9. 这会将libfoo.so.1 复制到目录/usr/local/lib
  10. 它还将头文件foo.h复制到目录/usr/local/include
  11. 这个头文件是foo.h对应软件1.0版本的版本
  12. 我现在也想安装第2版的软件,所以我运行git checkout release-2.0
  13. 这告诉我的系统我要处理 2.0 版的软件
  14. 我运行make,它编译了2.0版的代码
  15. 这将创建一个名为 libfoo.so.2 的库
  16. 我运行 make install,它会安装库
  17. 这会将libfoo.so.2 复制到目录/usr/local/lib
  18. 它还将头文件foo.h复制到目录/usr/local/include
  19. 这个头文件是foo.h对应软件2.0版本的版本
  20. 我现在尝试创建一个依赖于 2.0 版软件的项目,并将其链接到位于 /usr/local/liblibfoo.so.2,并包含位于 /usr/local/includefoo.h
  21. 此项目编译运行良好
  22. 我现在尝试创建一个依赖于 1.0 版软件的项目,并将其链接到位于 /usr/local/liblibfoo.so.1,并包含位于 /usr/local/includefoo.h
  23. 这个工程编译不ok,因为foo.h是2.0版软件的头文件,不是1.0版的。

所以,我很困惑的是如何在您的机器上安装某些软件的两个版本。实际的库文件libfoo.so.1libfoo.so.2 都是由两个不同的项目创建并可以链接到的,但是在本地机器上只安装了一个版本的foo.h。因此,只有最新安装的版本才会有正确的头文件,因为这两个版本需要不同版本的foo.h

请有人解释我在哪里感到困惑?谢谢!

【问题讨论】:

  • 从技术上讲,您的计算机上确实有两个版本的代码,但是您的工作文件夹(您克隆存储库的位置)将只有与您所在的 Git 分支相对应的源代码。因此,当您切换分支时,您会切换“软件”。
  • 但是当我运行make install,它会从repo文件夹复制东西到/usr/local/lib/usr/local/include时呢?它为每个版本处理不同的库文件,但只有一个头文件。与库文件不同,不会为每个版本创建新的头文件。但只能存在一个文件名foo.h。所以我不明白当两个版本需要两个不同的头文件并且只存在一个时,如何在一个项目中链接到它们......
  • 存在误解的地方——“我运行 git checkout release-1.0。这告诉我的系统我要处理 1.0 版的软件”。你不能真正在 Git 中检查标签,因为它们不能移动。如果你想在你的工作目录中放置一个看起来像特定标签的版本库,你可以使用 git checkout -b [branchname] [tagname] 在特定标签处创建一个新分支。 (发现git-scm.com/book/en/v2/Git-Basics-Tagging

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


【解决方案1】:

您可以将不同版本的库安装到单独的目录中,这样要安装的第二个版本不会覆盖第一个版本的文件。通常,您可以在运行configure 脚本时指定安装前缀。

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

./configure --prefix=/opt/foo-v1
make
make install

libfoo.so.1 将安装在 /opt/foo-v1/lib 中,foo.h(对于版本 1)将安装在 /opt/foo-v1/include 中。

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

./configure --prefix=/opt/foo-v2
make
make install

libfoo.so.2 将安装在 /opt/foo-v2/lib 中,foo.h(对于版本 2)将安装在 /opt/foo-v2/include 中。

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

clang++ -I/opt/foo-v1/include -L/opt/foo-v1/lib -lfoo program1.cc

同样,对于版本 2:

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

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

【讨论】:

    【解决方案2】:

    您的问题实际上根本与 git 无关。任何事情都会遇到同样的问题,问题的根源在于通过安装一个版本,您会覆盖固定位置 (/usr/lib/foo.h) 中的相同文件。如果您希望能够同时针对这两个版本,您必须找到一种方法来更改它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-16
      • 2021-09-16
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多