EA - 开源工程的编译

embedded/2025/3/6 23:56:05/

文章目录

    • EA - 开源工程的编译
    • 概述
    • 笔记
    • 环境
    • 备注
    • x86版本
    • EABase_x86
    • EAAssert_x86
    • EAThread_x86
      • 修改 eathread_atomic_standalone_msvc.h
        • 原始
        • 修改后
    • EAStdC_x86
    • EASTL_x86
    • EAMain_x86
    • EATest_x86
    • 备注
    • 备注
    • END

EA - 开源工程的编译

概述

EA开源了‘命令与征服’的游戏源码
尝试编译.
首先不是尝试编译游戏本身相关的工程,而是将基础代码编译了。否则游戏本身编译不过,缺东西。

笔记

环境

git bash 命令行
加入gnu make (git的用法整理), 看目录项 ‘为git bash 添加 make命令’
不确定编译时,是否需要make, 但是环境已经修改了,就这么着。
编写 my_git_bash.sh,用来带入cmake环境(用VS2019的CMake)

#!/bin/bash# @file my_git_bash.sh# C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>where cmake
# C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe
# export PATH="/c/Program Files/CMake/bin:$PATH"
export PATH="/C/Program Files (x86)/Microsoft Visual Studio/2019/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin:$PATH"# cmake --version
echo "cmake[vs2019] env set ok"
echo "if want to quit the sub shell, input cmd 'exit' to quit"exec bash

进入工程目录
用’git status’查看,是否有不在工程控制内的新文件和目录,有的话就删除。

rm -rf ./out
rm -rf .\build

EA的工程默认是x86的。
用管理员模式运行 git bash.

cd /D/3rd/game_prj
# 引入cmake环境,开sub shell
./my_git_bash.sh

备注

配置工程用的是git bash脚本和命令行,默认生成的工程是x64版本的。
应该是CMake参数要指定是x86还是x64才行。
现在需要编译一个x86的版本出来(EA开放的这些工程都是x86的),必须要在CMake参数中指定生成VS2019x86的工程。
如果不指定c++语言标准,默认都是用最新的实验性标准。
其中有一个工程用最新实验性标准编译不过,必须指定c++语言标准为C++14

cmake .. -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14

如果不是自己手工调用的git bash 脚本命令行,而是用EA工程自己写好的.sh, 那么该.sh中用的CMake命令行,也需要指定VS2019 x86的参数。

x86版本

EABase_x86

迁出工程到本地

git@github.com:electronicarts/EABase.git 

确认在工程源码目录中(如果不在工程目录中,就进入该工程目录)

cd EABase$ pwd
/D/3rd/game_prj/EABase

建立并进入build目录

mkdir ./build && cd ./build# 确认在构建目录中
$ pwd
/D/3rd/game_prj/EABase/build

生成工程文件

cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..

编译工程

cmake --build .

安装工程

# 因为编译出来的工程,默认是以Debug方式编译的,所以下面的命令无效
# 需要自己用VS2019工程编译Debug版,然后自己将东西拷贝到自己的库目录
# 打开 ./build/EABase.sln, 编译ALL_BUILD
# 手工将 D:\3rd\game_prj\prj1_EABase\include\Common\EABase 拷贝到 D:\EA_lib

EAAssert_x86

确认进入了工程源码目录

$ pwd
/D/3rd/game_prj/EAAssert
mkdir ./build && cd ./build
# 将 D:\3rd\game_prj\prj5_EASTL\* 中的内容拷贝到 D:\3rd\game_prj\prj2_EAAssert\test\packages\EASTL
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..
# 打开./build/EAAssert.sln, 为 EAAssert 工程添加头文件包含路径 D:\EA_lib
# 编译工程# 将 D:\3rd\game_prj\prj2_EAAssert\include\EAAssert 拷贝到 D:\EA_lib
# 将 D:\3rd\game_prj\prj2_EAAssert\build\Debug\* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug

EAThread_x86

确认进入了工程源码目录

cd /D/3rd/game_prj/EAThread$ pwd
/D/3rd/game_prj/EAThread
mkdir ./build && cd ./buildcmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..# 打开 ./build/EAThread.sln

修改 eathread_atomic_standalone_msvc.h

将 D:\3rd\game_prj\prj3_EAThread\include\eathread\internal\eathread_atomic_standalone_msvc.h 中的如下代码

原始
	#if defined(EA_PROCESSOR_X86)#define _InterlockedExchange64		_InterlockedExchange64_INLINE#define _InterlockedExchangeAdd64	_InterlockedExchangeAdd64_INLINE#define _InterlockedAnd64			_InterlockedAnd64_INLINE#define _InterlockedOr64			_InterlockedOr64_INLINE#define _InterlockedXor64			_InterlockedXor64_INLINE#endif
修改后
    // 在文件入口处#if defined(EA_PRAGMA_ONCE_SUPPORTED)#pragma once // Some compilers (e.g. VC++) benefit significantly from using this. We've measured 3-4% build speed improvements in apps as a result.#endif#include <windows.h> // add this for InterlockedXXX// ...// 在 EA_PROCESSOR_X86 存在时, 改为如下函数定义#if defined(EA_PROCESSOR_X86)#define _InterlockedExchange64		InterlockedExchange64#define _InterlockedExchangeAdd64	InterlockedExchangeAdd64#define _InterlockedAnd64			InterlockedAnd64#define _InterlockedOr64			InterlockedOr64#define _InterlockedXor64			InterlockedXor64#endif

编译 ALL_BUILD工程
将 D:\3rd\game_prj\prj3_EAThread\build\Debug* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
将 D:\3rd\game_prj\prj3_EAThread\include\eathread 拷贝到

EAStdC_x86

确认进入了工程源码目录

$ pwd
/D/3rd/game_prj/EAStdC
mkdir ./build && cd ./build
# 将 D:\3rd\game_prj\prj5_EASTL\* 拷贝到 D:\3rd\game_prj\prj4_EAStdC\test\packages\EASTL
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..# 打开 ./build/EAStdC.sln, 
修改EAStdC工程选项 ,添加头文件包含路径 D:\EA_lib
编译ALL_BUILD工程
将D:\3rd\game_prj\prj4_EAStdC\build\Debug\* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
将 D:\3rd\game_prj\prj4_EAStdC\include\EAStdC 拷贝到 D:\EA_lib

EASTL_x86

这个工程提供了编辑脚本
D:\3rd\game_prj\EASTL\scripts\build.sh
单步不要运行这个脚本,我们只编译x86Debug版本

确认进入了工程源码目录

cd /D/3rd/game_prj/EASTL$ pwd
/D/3rd/game_prj/EASTL
mkdir ./build && cd ./build
# 在 D:\3rd\game_prj\prj5_EASTL\test\packages 目录下,将其他的EA基础工程都拷贝进去(
2025-03-05  14:29    <DIR>          EAAssert
2025-03-05  14:29    <DIR>          EABase
2025-03-05  14:29    <DIR>          EAMain
2025-03-05  14:29    <DIR>          EAStdC
2025-03-05  14:29    <DIR>          EATest
2025-03-05  14:29    <DIR>          EAThread)
# 下面配置工程时,需要联网,好像也没下载啥,可能就是比对子模块的版本啥的,但是不联网不行。
cmake .. -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 -DEASTL_BUILD_TESTS:BOOL=OFF -DEASTL_BUILD_BENCHMARK:BOOL=ON# 用VS2019打开 ./build/EASTL.sln
# 编译ALL_BUILD工程
# 将 D:\3rd\game_prj\prj5_EASTL\build\Debug\* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
# 将 D:\3rd\game_prj\prj5_EASTL\include\EASTL 拷贝到 D:\EA_lib

EAMain_x86

确认进入了工程源码目录

$ pwd
/D/3rd/game_prj/EAMain
mkdir ./build && cd ./build
# 将 EASTL工程拷贝到 D:\3rd\game_prj\prj6_EAMain\test\packages\EASTL
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..# 用VS2019打开 ./build/EAMain.sln
# 设置 EAMain 工程的头文件包含路径为 D:\EA_lib, 将c++标准改为C++14
# 编译 ALL_BUILD 工程
# 将 D:\3rd\game_prj\prj6_EAMain\build\Debug\* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
# 将 D:\3rd\game_prj\prj6_EAMain\include\EAMain 拷贝到 D:\EA_lib

EATest_x86

确认进入了工程源码目录

$ pwd
/D/3rd/game_prj/EATest
mkdir ./build && cd ./build
# 将EASTL拷贝到 D:\3rd\game_prj\prj7_EATest\test\packages\EASTL
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD=14 ..
用VS2019打开 ./build/EATest.sln
# 为 EATest 工程添加头文件路径为 D:\EA_lib
# 编译 ALL_BUILD工程
将 D:\3rd\game_prj\prj7_EATest\build\Debug\* 拷贝到 D:\EA_lib\lib_vs2019_x86_debug
将 D:\3rd\game_prj\prj7_EATest\include\EATest 拷贝到 D:\EA_lib

备注

除了 EABase,只有头文件。
其他的EA基础组件,既有头文件,还有.lib

备注

需要确认所有的工程用VS2019编译时,采用的语言标准都是C++14. 否则多种语言标准生成的.lib混用时,可能有不良影响。
此时,就可以继续编译EA开源的游戏工程本身了,有需要EA_lib头和库的时候,包含进去就行。

END


http://www.ppmy.cn/embedded/170585.html

相关文章

Qt:事件

目录 处理事件 鼠标事件 键盘事件 定时器事件 窗口事件 虽然 Qt 是跨平台的 C 开发框架&#xff0c;Qt 的很多能力其实是操作系统提供的 只不过 Qt 封装了系统的 API 事件 前面学习过信号槽&#xff1a; 用户进行的各种操作&#xff0c;就可能会产生出信号&#xff0c;可以…

Ubuntu20.04双系统安装及软件安装(十三):录屏软件kazam

Ubuntu20.04双系统安装及软件安装&#xff08;十三&#xff09;&#xff1a;录屏软件kazam 打开终端&#xff0c;执行&#xff1a; sudo apt-get install kazam安装完成后&#xff0c;在菜单栏的所有程序中能找到一个类似于照相机的图标&#xff0c;即是kazam。界面非常简单&a…

Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章是MySQL篇中&#xff0c;非常实用性的篇章&#xff0c;相信在实际工作中对于表的查询&#xff0c;很多时候会涉及多表的查询&#xff0c;在多表查询…

Visual Studio Code集成MarsCode AI

Visual Studio Code集成MarsCode AI 1、搜索MarsCode AI 安装包 2、点击install安装即可 小编这里已经安装过了 3、登录自己的账号 点击链接&#xff0c;注册账号 https://www.marscode.cn/events/s/i5DRGqqo/ 4、登录后可以自己切换模型

Ruby爬虫如何控制并发数量:爬取京东电子产品

1. 引言 京东作为中国最大的电商平台之一&#xff0c;拥有海量的商品信息&#xff0c;其中电子产品是其热门品类之一。对于市场研究人员、数据分析师和开发者来说&#xff0c;能够高效地爬取和分析这些数据具有重要的价值。然而&#xff0c;京东网站的复杂性和反爬措施使得爬取…

【前端】【vue辅助】【vue-tsc】用于 Vue 项目的 TypeScript 检查工具

vue-tsc 是一个用于 Vue 项目的 TypeScript 检查工具&#xff0c;下面介绍它的作用和使用场景&#xff1a; 主要作用 1. 类型检查 vue-tsc 的核心功能是对 Vue 项目中的 TypeScript 代码进行类型检查。在 Vue 项目里&#xff0c;尤其是使用 Vue 3 并结合 TypeScript 开发时&…

ESLint 深度解析:原理、规则与插件开发实践

在前端开发的复杂生态中&#xff0c;保障代码质量与规范性是构建稳健、可维护项目的基石。ESLint 作为一款强大的代码检查工具&#xff0c;其默认规则与插件能满足多数常见需求&#xff0c;但面对特定团队规范或项目独特要求&#xff0c;自定义 ESLint 插件便成为有力的扩展手段…

Zookeeper 的 Node(Znode) 是什么?Zookeeper 监听机制的特点是什么?

Zookeeper 提供了一种 发布-订阅&#xff08;Pub-Sub&#xff09;机制&#xff0c;不过它更常被称为 Watch 机制。核心思想是&#xff1a;客户端可以对某个 Zookeeper 节点&#xff08;Node&#xff09;设置 Watch&#xff0c;当这个节点发生变化时&#xff0c;Zookeeper 会主动…