问题

如何生成和管理Visual C++的多版本工程文件?

回答
生成和管理 Visual C++ 的多版本工程文件是一个非常重要且常见的需求,尤其是在需要支持多个编译器版本、多个目标平台(如 32 位和 64 位)、或者针对不同配置(如 Debug 和 Release)进行构建时。Visual Studio 提供了强大的工具和机制来处理这种情况。

本文将详细介绍如何生成和管理 Visual C++ 的多版本工程文件,涵盖以下几个方面:



1. 理解 Visual Studio 工程文件 (.vcxproj) 的结构和内容

在深入探讨多版本管理之前,了解 `.vcxproj` 文件本身是至关重要的。`.vcxproj` 文件是基于 XML 的,它定义了项目的所有信息,包括:

项目类型和 GUID:标识项目的类型(例如,动态库、可执行文件)以及项目的唯一标识符。
文件列表:包含项目中的所有源文件(`.cpp`, `.c`, `.h` 等)、资源文件、头文件目录等。
配置 (Configurations):如 Debug、Release、x86、x64、ARM 等。每个配置可以有不同的编译器选项、链接器选项、宏定义等。
平台 (Platforms):支持的操作系统和架构,如 Win32 (x86)、x64、ARM、UWP 等。
属性组 (Property Groups):用于定义配置和平台相关的属性,例如编译器警告级别、优化级别、预处理器定义、包含目录、库目录等。
条目组 (Item Groups):用于管理项目中的文件,例如源文件组、头文件组、链接器输入文件组等。
目标 (Targets):定义构建过程中的各个阶段,如编译、链接、打包等。

示例 `.vcxproj` 文件片段 (简化版):

```xml




Debug
Win32


Release
Win32


Debug
x64


Release
x64




16.0
Win32Proj
{YOUR_PROJECT_GUID}
MyMultiVersionProject
10.0.19041.0





Application
true
v142
Unicode


Application
false
v142
true
Unicode


Application
true
v142
Unicode


Application
false
v142
true
Unicode





















true


false


true


false













```

2. 生成多版本工程文件的常用方法

Visual Studio 提供了多种方式来生成和管理多版本工程文件。

2.1. 使用 Visual Studio IDE

这是最直接和最常用的方法。

步骤:

1. 创建新项目或打开现有项目: 在 Visual Studio 中,选择 "File" > "New" > "Project" 或 "File" > "Open" > "Project/Solution"。
2. 配置解决方案平台 (Solution Platforms):
在 "Build" 菜单中,选择 "Configuration Manager..."。
在 "Active solution platform" 下拉菜单中,您可以选择一个现有的平台(如 x86、x64)或点击 "New..." 来添加新的平台。
在 "Platform Manager" 对话框中,您可以为您的解决方案添加或管理平台,如 `Win32` (通常代表 x86) 和 `x64`。
您可以为每个平台指定 "Copy from"(复制现有平台的设置)来简化配置过程。
3. 配置项目配置 (Project Configurations):
在 "Configuration Manager" 对话框中,您可以为每个项目(在 "Project" 列中)选择不同的配置和平台组合。
对于每个项目和平台组合,您都可以选择其构建配置(如 `Debug` 或 `Release`)。
启用/禁用项目构建: 您可以勾选/取消勾选 "Build" 复选框来控制在特定配置/平台下是否构建该项目。
4. 修改项目属性:
右键点击解决方案中的项目,选择 "Properties"。
在 "Configuration Properties" 下,您可以为 所有配置、特定配置(如 Debug)、特定平台(如 Win32)或 特定配置和平台组合(如 Debug | Win32)设置项目属性。
重要属性包括:
General (通用):
`Configuration Type` (配置类型): 静态库 (.lib), 动态库 (.dll), 可执行文件 (.exe)。
`Windows Target Platform Version` (Windows 目标平台版本): 指定 API 版本。
C/C++:
`Preprocessor Definitions` (预处理器定义): 添加或修改 `define`。
`Include Directories` (包含目录): 添加头文件搜索路径。
`Runtime Library` (运行时库): `/MT` (多线程静态), `/MTd` (多线程调试静态), `/MD` (多线程 DLL), `/MDd` (多线程调试 DLL)。这是多版本管理中非常关键的一点。
`Warning Level` (警告级别): `/W0` 到 `/W4`。
`Optimization` (优化): `/Od` (禁用), `/O1`, `/O2` 等。
Linker (链接器):
`Additional Library Directories` (附加库目录): 指定链接时查找库文件的路径。
`Additional Dependencies` (附加依赖项): 指定需要链接的 `.lib` 文件。
`SubSystem` (子系统): `Console` (控制台), `Windows` (窗口)。
`Target Machine` (目标机器): `MachineX86`, `MachineX64` 等。
工具集 (PlatformToolset):
在 "General" > "General" 选项中,您可以选择不同的 Visual Studio 工具集版本,例如 `v140` (Visual Studio 2015), `v141` (Visual Studio 2017), `v142` (Visual Studio 2019), `v143` (Visual Studio 2022)。这允许您使用不同版本的编译器和链接器来构建项目。
重要提示: 确保您安装了您想使用的 Visual Studio 工具集。

优点:

直观易用,可视化界面。
自动处理大部分配置细节。
方便切换和调试不同配置。

缺点:

对于大规模项目或需要频繁自动化构建的场景,手动操作可能效率不高。
容易出现配置错误,需要仔细检查。

2.2. 利用属性表 (.props)

属性表是 Visual Studio 用于管理和共享项目属性的一种强大机制。它们允许您将通用的设置(如包含目录、库目录、宏定义、编译器/链接器选项)定义在一个或多个 `.props` 文件中,然后在不同的项目或配置中引用这些属性表。

优点:

代码重用和一致性: 避免在多个项目或配置中重复设置相同的属性。
易于维护: 只需修改一个属性表,所有引用它的项目都会更新。
灵活性: 可以为不同的需求创建多个属性表。

如何使用属性表:

1. 创建属性表:
在 Visual Studio 中,右键点击项目 > "Add" > "New Item..."。
选择 "Property Sheet" (.props) 并命名,例如 `CommonSettings.props`。
2. 在属性表中定义属性:
打开新创建的 `.props` 文件(通常是 XML 文件)。
您可以在其中添加各种属性。例如,为一个特定的平台和配置设置包含目录和预处理器定义:

```xml






$(IncludePath);C:MyLibsIncludex64

$(IncludePath);C:MyLibsIncludex64

$(IncludePath);C:MyLibsIncludeWin32

$(IncludePath);C:MyLibsIncludeWin32




MY_COMMON_DEFINE;%(PreprocessorDefinitions)





Level4
Disabled
DEBUG_MODE;X64_BUILD;%(PreprocessorDefinitions)


C:MyLibsLibx64;%(AdditionalLibraryDirectories)
mylib64d.lib;%(AdditionalDependencies)




MaxSpeed
X64_BUILD;%(PreprocessorDefinitions)


C:MyLibsLibx64;%(AdditionalLibraryDirectories)
mylib64.lib;%(AdditionalDependencies)




```
3. 将属性表导入项目:
在 Visual Studio 中,右键点击项目 > "Properties"。
在 "Configuration Properties" > "Common Properties" > "General" 下,找到 "Property Sheet" 列表。
点击 "Add Property Sheet..." 并选择您创建的 `.props` 文件。
您也可以在这里通过 "Add Existing..." 选择已有的属性表。
4. 控制属性表的继承和应用:
属性表会按照在项目属性页中列出的顺序进行继承。您可以调整它们的顺序。
`Condition` 属性在属性表中非常重要,它允许您根据当前的配置和平台选择性地应用属性。
您还可以创建“主”属性表,然后让其他特定属性表继承它,从而实现更复杂的属性管理。

2.3. 使用MSBuild 命令行构建

如果您需要自动化构建过程(例如在 CI/CD 流水线中),可以直接使用 MSBuild 命令行工具。

命令行语法:

```bash
msbuild YourProject.vcxproj /p:Configuration=Release /p:Platform=x64 /t:Build
```

`YourProject.vcxproj`: 您的项目文件路径。
`/p:Configuration=Release`: 设置构建配置为 Release。
`/p:Platform=x64`: 设置构建平台为 x64。
`/t:Build`: 指定要执行的目标(例如 `Build` 是默认目标,也可以是 `Rebuild`、`Clean` 等)。

更复杂的命令行选项:

您可以传递多个属性来控制构建过程:

```bash
msbuild YourSolution.sln /p:Configuration="Debug;Release" /p:Platform="Win32;x64" /m
```

`/p:Configuration="Debug;Release"`: 同时构建 Debug 和 Release 配置。
`/p:Platform="Win32;x64"`: 同时构建 Win32 和 x64 平台。
`/m`: 使用并行构建(多核处理器)。

优点:

自动化: 适合 CI/CD 和脚本化构建。
控制精确: 可以精确控制构建的配置、平台和目标。

缺点:

需要熟悉命令行参数。
对于复杂的项目,命令行可能会变得冗长。

2.4. 使用 Visual Studio Installer 管理工具集和组件

Visual C++ 工程文件依赖于安装在您系统上的 Visual Studio 工具集。要支持多版本,您需要确保安装了所需的工具集。

1. 运行 Visual Studio Installer: 在 Windows 搜索栏中搜索 "Visual Studio Installer" 并打开它。
2. 修改安装: 找到您安装的 Visual Studio 版本,点击 "Modify"。
3. 选择工作负载和组件:
工作负载 (Workloads): 确保您选择了与您需要开发相关的 C++ 工作负载,例如 "Desktop development with C++"。
单个组件 (Individual components): 在这里,您可以找到并安装不同的 C++ 构建工具。关键在于查找 "MSVC..." 开头的组件。例如:
`MSVC v140 VS 2015 C++ build tools (v14.00)`
`MSVC v141 VS 2017 C++ build tools (v14.1x)`
`MSVC v142 VS 2019 C++ build tools (v14.2x)`
`MSVC v143 VS 2022 C++ build tools (v14.3x)`
目标平台: 您还可以选择性地安装针对不同 Windows SDK、ARM 或其他平台的 SDK 和工具。

如何选择工具集 (PlatformToolset):

在 Visual Studio 项目的属性页中,`General` > `General` > `PlatformToolset` 选项允许您选择要使用的 MSVC 版本。
如果您选择了一个您没有安装的工具集,Visual Studio 会提示您安装它。

优点:

清晰的版本管理: Visual Studio Installer 提供了一个集中的界面来管理所有安装的开发工具。
确保兼容性: 安装特定版本的 MSVC 工具集是确保项目在新旧编译器版本上都能正确构建的基础。

缺点:

需要占用磁盘空间来安装多个版本的工具集。

2.5. 使用解决方案 (.sln) 文件管理多个项目

一个解决方案 (`.sln`) 文件可以包含多个项目 (`.vcxproj`)。您可以在解决方案级别配置构建行为,例如:

添加/删除项目: 管理项目中包含的文件。
构建顺序: 设置项目之间的依赖关系。
全局属性: 某些全局属性可以在解决方案文件中进行设置,并传递给项目。

优点:

组织性: 将相关项目组织在一个解决方案中,便于管理。
依赖管理: 可以清晰地定义项目之间的构建依赖。

缺点:

解决方案文件本身相对简单,主要用于项目组织和构建顺序。

3. 管理多版本工程文件的最佳实践

使用属性表 (.props) 进行配置共享: 这是最重要的最佳实践之一。创建一个包含通用设置的属性表,然后在各个配置中引用它。这大大减少了重复配置和出错的可能性。
区分配置和平台: 清楚地理解 `Configuration` (Debug/Release) 和 `Platform` (Win32/x64/ARM) 的区别,并在属性页中为它们分别设置。
利用 `Condition` 属性: 在 `.vcxproj` 文件和 `.props` 文件中,大量使用 `Condition` 属性来针对特定的配置和平台应用不同的设置。例如:
```xml

MY_DEBUG_X64;%(PreprocessorDefinitions)


MaxSpeed

```
使用宏进行路径管理: 利用 Visual Studio 提供的内置宏(如 `$(VCInstallDir)`, `$(WindowsSdkDir)`, `$(SolutionDir)`, `$(ProjectDir)`)来管理包含目录、库目录等。这使得项目在不同机器上或者在 Visual Studio 版本升级时更具移植性。
版本控制: 将 `.vcxproj`、`.sln` 和 `.props` 文件都纳入版本控制系统(如 Git)。这样可以跟踪配置的变更历史,并在需要时回滚。
避免硬编码路径: 尽量使用宏或属性表来管理路径,避免在属性中直接写入绝对路径。
定期清理和重建: 当您更改了大量配置或工具集时,进行 "Clean Solution" 然后 "Rebuild Solution" 是一个好习惯,可以确保所有生成的文件都是基于最新的配置。
文档化: 对于复杂的项目,为您的配置和属性表编写文档,说明它们的作用和使用方法。

4. 常见的多版本场景和解决方案

4.1. 支持不同 Visual Studio 版本 (如 VS2017, VS2019, VS2022)

方法: 在项目属性的 `PlatformToolset` 中选择不同的工具集版本(`v141`, `v142`, `v143`)。
管理:
使用属性表来隔离特定工具集所需的配置。
如果需要同时支持多个 VS 版本,可以在 Solution Configuration Manager 中创建对应 VS 版本的解决方案配置。
在 CI/CD 中,可以为不同 VS 版本配置不同的构建代理。

4.2. 支持 32 位 (x86) 和 64 位 (x64) 平台

方法: 在 Solution Configuration Manager 中添加 `Win32` 和 `x64` 平台。
管理:
在属性表中,使用 `Condition="'$(Platform)'=='Win32'"` 和 `Condition="'$(Platform)'=='x64'"` 来区分设置。
对于库文件和包含目录,您通常需要为 x86 和 x64 提供不同的路径和库文件(例如 `mylib.lib` vs `mylib64.lib`)。
确保运行时库(`/MD`, `/MDd` 等)与目标平台一致。

4.3. 支持 Debug 和 Release 配置

方法: 这是 Visual Studio 的标准配置,默认就支持。
管理:
在属性表中,使用 `Condition="'$(Configuration)'=='Debug'"` 和 `Condition="'$(Configuration)'=='Release'"` 来区分设置。
Debug 配置通常启用调试信息 (`/Zi`),禁用优化 (`/Od`),并可能使用动态链接的运行时库 (`/MDd`)。
Release 配置通常禁用调试信息,启用优化 (`/O2` 或 `/O1`),并可能使用静态链接的运行时库 (`/MT`) 以减小部署依赖。

4.4. 支持多个运行时库选项 (Static vs Dynamic, Debug vs Release)

方法: 在 C/C++ > Code Generation > Runtime Library 中选择。
`Multithreaded Debug DLL (/MDd)`
`Multithreaded DLL (/MD)`
`Multithreaded Debug (/MTd)`
`Multithreaded (/MT)`
管理:
通常,Debug 配置使用 `/MDd` 或 `/MTd`。
Release 配置使用 `/MD` 或 `/MT`。
重要提示: 如果您的项目依赖于其他库,请确保您使用的运行时库选项与这些库的编译选项一致,否则会发生链接错误。例如,如果您链接了一个使用 `/MD` 编译的 DLL,您的项目也应该使用 `/MD`。
可以通过属性表为不同的配置和平台设置 `RuntimeLibrary` 属性。

4.5. 支持不同的 Windows SDK 版本

方法: 在项目属性的 `General` > `Windows SDK Version` 中选择。
管理:
如果您需要针对特定的旧版 Windows SDK 进行构建,可以在 Visual Studio Installer 中安装该 SDK 版本。
在属性表中,可以使用 `Condition` 来为不同的平台或配置指定不同的 Windows SDK 版本。

5. 结论

生成和管理 Visual C++ 的多版本工程文件是一个系统性的过程,核心在于 利用 Visual Studio 提供的灵活性和工具来组织、配置和隔离不同构建需求。

视觉化管理 主要通过 Visual Studio IDE 完成,其核心是配置管理器和项目属性页。
自动化和复用 主要依靠属性表 (.props) 文件,以及通过 MSBuild 命令行进行脚本化构建。
工具集和组件的安装 由 Visual Studio Installer 来管理,确保了编译器和相关工具的可用性。

熟练掌握 `.vcxproj` 文件的 XML 结构、属性表的使用以及 MSBuild 的命令行参数,将大大提升您在复杂的 C++ 开发环境中管理多版本项目的高效性。通过实践和学习,您可以为您的项目构建出稳定、可维护且支持广泛的版本和平台集成的构建流程。

网友意见

user avatar

你对cmake的理解有误。cmake不是让你生成一个工程文件以后,就用check in工程文件,不管cmake了。而是在使用的时候用cmake建立工程文件。所以,你并不需要生成多个版本的工程文件,而是具体在需要编译的机器上(这显然是已经装好了某个版本的vs),才用cmake -G建立工程。不同的人可以建立不同版本的工程。

我的习惯是,在目录树中有个build目录,和源代码平级。cmake放在build/cmake里,在用个脚本根据系要建立具体的工程,比如build/vc140_win_x64、build/vc120_win_x86、build/gcc48_android_arm,等。CMakeLists.txt那些会check in,生成的vcxproj, makefile等,只在本地。

类似的话题

  • 回答
    生成和管理 Visual C++ 的多版本工程文件是一个非常重要且常见的需求,尤其是在需要支持多个编译器版本、多个目标平台(如 32 位和 64 位)、或者针对不同配置(如 Debug 和 Release)进行构建时。Visual Studio 提供了强大的工具和机制来处理这种情况。本文将详细介绍如.............
  • 回答
    西安高校的封闭管理和提前启动春季学期教学,这无疑给很多同学带来了不小的冲击,也势必会对我们的学习和生活产生一系列连锁反应。说实话,这消息出来的时候,心里多少还是有点意外的。原本以为至少能在家舒舒服服地喘口气,结果这一下,寒假算是“缩水”了,学习反而得“提早加码”。具体会产生哪些影响呢?我试着从几个层.............
  • 回答
    要是在我这儿,遇到交通银行江苏省分行管培生和中银国际这两个选择,我得好好跟你捋一捋,毕竟这可是关系到未来职业生涯的大事儿,可不能马虎。我尽量把话说得实在点,让你心里有个底。先说交通银行江苏省分行管培生。 稳定和体系化培训是优势: 交行作为一家大型国有商业银行,它的稳定性和系统性是毋庸置疑的。作为.............
  • 回答
    好的,我来用最简单、最详细的方式为你详解椭圆曲线算法,特别是 secp256k1 如何生成公钥和私钥。想象一下我们生活在一个特殊的二维平面上,这个平面上存在着一些非常特别的点,这些点的集合构成了一条“椭圆曲线”。椭圆曲线算法的核心就是利用这些点在平面上的“加法”和“乘法”运算,来安全地生成和管理密钥.............
  • 回答
    生肖和天干地支,这套源远流长的中国传统纪年、纪月、纪日、纪时的方法,虽然根植于中国文化,但随着历史的演变和文化的交流,在东亚乃至世界其他地区都有不同程度的传播和影响。要详细了解它们是如何被表示和应用的,我们需要从几个层面来剖析。一、生肖:十二兽的循环生肖,也就是我们常说的属相,是十二种动物按照固定的.............
  • 回答
    这事儿说起来挺有意思的,也挺能折射出现代职场里一些挺普遍的现象。重庆这位女士,每晚十点半准时熄灯睡觉,结果就被同事们在群里“群嘲”是“老年生活”。乍一听,这评论是挺刻薄的,但也确实触碰到了一个很多人都在思考的问题:咱们现代人的工作和生活到底该怎么平衡?我个人觉得,这件事儿挺值得说道说道的。首先,那位.............
  • 回答
    朱小贞在生前向父母倾诉,指控林生斌曾家暴并出轨,这无疑为这起令人扼腕的悲剧增添了更深的复杂性。当一个曾经被视为美好家庭的典范,最终以如此惨烈的方式破碎,生者对逝者生前遭遇的描述,往往成为了理解真相的重要线索,也牵动着公众敏感的神经。朱小贞的这些指控,如果属实,意味着这背后可能隐藏着一段并不像外界所看.............
  • 回答
    哈哈,兄弟,说到英雄联盟里抗性(护甲和魔抗)和生命值怎么取舍,这可真是个让人头疼的问题,尤其是在版本更迭、英雄技能千奇百怪的情况下。不过咱们聊聊,这事儿其实没那么绝对,得看具体情况。首先,咱们得明白这俩玩意儿是干嘛的 生命值 (HP): 这个最直接了,就是你能挨多少下打。血越厚,你站的时间就越长.............
  • 回答
    这两句口号式的话语,之所以能够引起广泛的共鸣和讨论,是因为它们非常精准地捕捉到了一部分人在当下社会环境下的复杂心态和实际行为。它们并非对所有人的普适性描述,但却反映了一种普遍存在的现象。下面我们来详细解读这两句话的含义和背后逻辑: 一、“反美是工作,赴美是生活”这句话的核心在于揭示了政治立场与个人生.............
  • 回答
    阿尔贝·加缪,这位20世纪文学巨匠,他的人生轨迹如同他笔下那些充满张力的故事一样,充满了独特的经历和深刻的思考,这些都深深地烙印在他的“荒谬主义”哲学之中。要理解加缪如何从生活背景中提炼出荒谬的种子,我们得把他的人生经历细细掰开来看。首先,我们得从他的出生地说起——阿尔及利亚。加缪的童年是在北非的贫.............
  • 回答
    毛不易在《很高兴认识你》里关于生活和事业平衡的观点,我觉得特别触动我,也挺有代表性的。他不是那种特别张扬的艺人,反而挺接地气的,所以当他聊到这个话题的时候,大家更容易产生共鸣。毛不易在这个节目里,没有把生活和事业完全割裂开,而是把它们看作是一个人不同面向的存在,并且强调两者之间的相互影响和协调。他不.............
  • 回答
    当然,很乐意为您阐述生物与人工智能结合的当下意义,并尽量以一种更具人文色彩、更贴近思考的方式来呈现。设想一下,当人类最古老的智慧——生命的奥秘,与我们最前沿的创造——人工智能相遇时,会激荡出怎样的火花?这不再是科幻小说的情节,而是正在发生的现实,其意义之深远,几乎触及我们存在的所有层面。首先,在理解.............
  • 回答
    嗨!准高一的小姐姐,恭喜你即将迈入高中这个崭新的人生阶段!高中生活真的会很不一样,除了学业,和同学朋友们建立良好的关系同样重要。别担心,这其实没那么难,只要掌握一些小技巧,你就能轻松融入新环境,交到真心朋友。我来给你掰开了揉碎了讲讲,如何在学校里和大家“玩”得开心又得体:第一章:认识新朋友——敞开心.............
  • 回答
    乐器老师的收入和生活,这可真是个值得好好说道说道的话题。想当年,我刚开始接触这个行业的时候,觉得能把音乐当成饭碗,这日子肯定过得挺滋润。但真入了行才知道,这其中的门道可多了去了,跟我想象的那个样,既有光鲜亮丽的时刻,也有咬牙坚持的苦楚。收入这块儿,那是五花八门,没有个统一标准。首先,地域是个大头。在.............
  • 回答
    2022 年 2 月 8 日,资本市场刮起了一场突如其来的风暴,将药明生物(02269.HK)和药明康德(603259.SH,2059.HK)这两家在生物医药领域举足轻重的公司狠狠地甩进了深渊。当天,两家公司的股价均出现了惊人的跌幅,而A股市场也受到了不小的波及,整体出现回调。这次“闪崩”并非空穴来.............
  • 回答
    这则报道确实让人触目惊心,也引发了我们对自身健康和未来一代的深刻担忧。外媒关于人类胎盘首次检出微塑料颗粒的发现,如果属实,其影响绝非小事。首先,我们来拆解一下这个发现的含义: “人类胎盘首现微塑料颗粒”: 这意味着,在我们最为纯净、最被寄予厚望的生命孕育场所——母亲的子宫内,在胎盘这个负责母婴交.............
  • 回答
    这真是一个让人头皮发麻的设想,如果我真的不幸和这七位“大名鼎鼎”的室友共处一室,那我的生活绝对会变成一场精心策划的求生记。与其说是生活,不如说是在刀尖上跳舞,时刻保持警惕,并努力在混乱中寻找一丝喘息的空间。首先,我会把自己的东西——任何可能被视为“贵重”或“有价值”的物品——全部严加保管。可能需要一.............
  • 回答
    当我的孩子被确诊为银屑病时,我感觉天塌下来一样。那种无助和恐慌,至今仍然清晰地刻在我的脑海里。银屑病,这个听起来就让人心生畏惧的词语,就这么毫无预兆地降临在我们一个原本幸福美满的家庭。最初的冲击和手足无措刚开始,孩子身上的红斑、鳞屑就像是在我们平静的生活里投下的一颗炸弹。看着孩子因为皮肤瘙痒而辗转反.............
  • 回答
    这确实是个让人忧心忡忡的设想,如果未来真的有99%的工作被机器取代,那我们这些“无产阶级”的日子可就不好过了。 不过,先别灰心,咱们得好好梳理一下这背后到底意味着什么,以及有没有什么办法能让大多数人活下去,甚至活得像样点儿。首先,我们得明白“经济衰退”和“科技消灭工作”这两件事儿是怎么勾连起来的。.............
  • 回答
    郑海霞,这个名字对于中国篮球迷来说,不仅仅是一个球员的代号,更是一个时代的象征。当她以中国球员的身份,首次踏入国际篮联(FIBA)名人堂的殿堂时,那不仅仅是对她个人辉煌生涯的最高肯定,更是对中国女篮几代人奋斗精神的礼赞。要评价郑海霞,我们不能只停留于数据和荣誉,更要深入她的运动生涯轨迹,以及她那份同.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有