【发布时间】:2016-06-04 15:46:33
【问题描述】:
我真的很难理解git,所以这里是对我之前提出的问题的更严格的改写。我将解释一个假设的场景,详细说明当您使用git 下载一些代码并将其安装到机器上时我认为会发生什么,希望有人能告诉我哪部分不正确!
- 我跑
git clone git://github.com/foo/foo.git - 这会创建一个本地目录
foo,并下载源代码和git数据 - 此源代码有效地包含了软件的所有版本:源文件、头文件和不同版本的 git 数据
- 我跑
git checkout release-1.0 - 这告诉我的系统我要处理 1.0 版的软件
- 我运行
make,它编译1.0版的代码 - 这将创建一个名为
libfoo.so.1的库 - 我运行
make install,它会安装库 - 这会将
libfoo.so.1复制到目录/usr/local/lib - 它还将头文件
foo.h复制到目录/usr/local/include - 这个头文件是
foo.h对应软件1.0版本的版本 - 我现在也想安装第2版的软件,所以我运行
git checkout release-2.0 - 这告诉我的系统我要处理 2.0 版的软件
- 我运行
make,它编译了2.0版的代码 - 这将创建一个名为
libfoo.so.2的库 - 我运行
make install,它会安装库 - 这会将
libfoo.so.2复制到目录/usr/local/lib - 它还将头文件
foo.h复制到目录/usr/local/include - 这个头文件是
foo.h对应软件2.0版本的版本 - 我现在尝试创建一个依赖于 2.0 版软件的项目,并将其链接到位于
/usr/local/lib的libfoo.so.2,并包含位于/usr/local/include的foo.h - 此项目编译运行良好
- 我现在尝试创建一个依赖于 1.0 版软件的项目,并将其链接到位于
/usr/local/lib的libfoo.so.1,并包含位于/usr/local/include的foo.h - 这个工程编译不ok,因为
foo.h是2.0版软件的头文件,不是1.0版的。
所以,我很困惑的是如何在您的机器上安装某些软件的两个版本。实际的库文件libfoo.so.1 和libfoo.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