EA - 开源工程的编译

文章目录

    • 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.mzph.cn/bicheng/72792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一招解决Pytorch GPU版本安装慢的问题

Pytorch是一个流行的深度学习框架&#xff0c;广泛应用于计算机视觉、自然语言处理等领域。安装Pytorch GPU版本可以充分利用GPU的并行计算能力&#xff0c;加速模型的训练和推理过程。接下来&#xff0c;我们将详细介绍如何在Windows操作系统上安装Pytorch GPU版本。 查看是否…

为解决局域网IP、DNS切换的Windows BAT脚本

一、背景 为解决公司普通人员需要切换IP、DNS的情况&#xff0c;于是搞了个windows下的bat脚本&#xff0c;可以对有线网络、无线网络进行切换设置。 脚本内容 echo off title 多网络接口IP切换工具:menu cls echo echo 请选择要配置的网络接口: echo echo 1. 有线网络&am…

uni_app实现下拉刷新

1. 在页面配置中启用下拉刷新 首先&#xff0c;你需要在页面的 pages.json 文件中启用下拉刷新功能。 {"pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "首页","enablePull…

OpenCV计算摄影学(14)实现对比度保留去色(Contrast Preserving Decolorization)的函数decolor()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将彩色图像转换为灰度图像。它是数字印刷、风格化的黑白照片渲染&#xff0c;以及许多单通道图像处理应用中的基本工具。 cv::decolor 是 OpenCV…

Qt常用控件之 纵向列表QListWidget

纵向列表QListWidget QListWidget 是一个纵向列表控件。 QListWidget属性 属性说明currentRow当前被选中的是第几行。count一共有多少行。sortingEnabled是否允许排序。isWrapping是否允许换行。itemAlignment元素的对齐方式。selectRectVisible被选中的元素矩形是否可见。s…

关于 QPalette设置按钮背景未显示出来 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/146047054 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

PostgreSQL 安装与使用

下载地址: EDB: Open-Source, Enterprise Postgres Database Management 安装图形化安装界面安装。安装完后将bin目录配置到系统环境变量 执行psql -h localhost -p 5432 -U postgres 密码在安装过程中设置的 ​ 0、修改密码 ALTER USER sonar WITH PASSWORD 123456; 1、新…

【基础3】快速排序

核心思路 快速排序是Java中Arrays.sort()的实现原理&#xff0c;采用分治策略&#xff0c;通过选择基准元素&#xff0c;将数组分为两个子数组&#xff0c;使得左边元素 ≤ 基准元素 ≤ 右边元素&#xff0c;然后递归排序子数组。 举个简单的例子&#xff0c;图书管理员需要按…

FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求

FreeSWITCH 简单图形化界面40 - 使用mod_curl模块进行http请求 0、界面预览00、简介1、编译安装1.1 编辑模块配置文件 2、使用2.1 拨号规则GET 请求POST 请求JSON 数据 2.2 Lua 脚本GET 请求POST 请求JSON 数据 3 、示例3.1 示例 1&#xff1a;提交 CDR 到第三方接口3.2 示例 2…

Linux 开发工具

linux中&#xff0c;常见的软件安装方式---下载 yum/apt.rpm安装包安装源码安装 yum 查看软件包 通过yumlist命令可以罗列出当前⼀共有哪些软件包.由于包的数⽬可能⾮常之多,这⾥我们需要使⽤ grep 命令只筛选出我们关注的包.例如: # Centos $ yum list | grep lrzsz lr…

Agent革命:Manus如何用工作流拆解掀起AI生产力革命

一、现象级产品的诞生背景 2025年3月6日&#xff0c;一款名为Manus的AI产品在技术圈引发地震式传播。其官方测试数据显示&#xff1a;在GAIA基准测试中&#xff0c;基础任务准确率达86.5%&#xff08;接近人类水平&#xff09;&#xff0c;中高级任务完成率突破57%。这标志着A…

Linux13-TCP\HTTP

一、TCP粘包问题 1.TCP在接受数据时,多包数据粘在一起 2.原因: 2.1TCP发送数据时,会根据缓冲区数据的情况进行重新组包 2.2TCP接收方,没有及时读走缓冲区数据,导致缓冲区大量数据缓存。 3.如何解决 3.1发指定大小字节 将要发数据,封装在结构体里 struct data { …

网络安全等级保护2.0 vs GDPR vs NIST 2.0:全方位对比解析

在网络安全日益重要的今天&#xff0c;各国纷纷出台相关政策法规&#xff0c;以加强信息安全保护。本文将对比我国网络安全等级保护2.0、欧盟的GDPR以及美国的NIST 2.0&#xff0c;分析它们各自的特点及差异。 网络安全等级保护2.0 网络安全等级保护2.0是我国信息安全领域的一…

oracle通过dmp导入数据

1、创建用户&#xff0c;并赋予sysdba权限 登录sysdba用户 sqlplus / as sysdba 赋予sysdba权限 grant sysdba to your_user; 2、导入dmp文件 imp target_user/passwordip:port/SERVER_NAME fromusersource_user tousertarget_user fileyour.dmp logdmp_file.log statist…

MySQL 面试篇

MySQL相关面试题 定位慢查询 **面试官&#xff1a;**MySQL中&#xff0c;如何定位慢查询? 我们当时做压测的时候有的接口非常的慢&#xff0c;接口的响应时间超过了2秒以上&#xff0c;因为我们当时的系统部署了运维的监控系统Skywalking &#xff0c;在展示的报表中可以看到…

MyBatis 操作数据库

目录 1、MyBatis 是什么2、配置 MyBatis 开发环境2.1、添加 MyBatis 框架支持2.1.1、老项目添加 MyBatis2.1.2、新项目添加 MyBatis 2.2、配置数据库连接字符串2.3、配置 MyBatis 中的 XML 路径 3、添加业务代码3.1、添加实体类3.2、添加 mapper 接口3.3、添加 xml 文件3.4、添…

uniapp使用蓝牙,usb,局域网,打印机打印

使用流程&#xff08;支持安卓和iOS&#xff09; 引入SDK 引入原生插件包地址如下 https://github.com/oldfive20250214/UniPrinterDemo 连接设备 安卓支持经典蓝牙、ble蓝牙、usb、局域网&#xff08;参考API&#xff09; iOS支持ble蓝牙、局域网&#xff08;参考API&…

Jmeter进行http接口测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文主要针对http接口进行测试&#xff0c;使用 jmeter工具实现。 Jmeter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较…

力扣35.搜索插入位置-二分查找

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:# 初始化左右指针left, right 0, len(nums) - 1# 当左指针小于等于右指针时&#xff0c;继续循环while left < right:# 计算中间位置mid (left right) // 2# 如果中间元素等于目标值&…

为AI聊天工具添加一个知识系统 之133 详细设计之74通用编程语言 之4 架构及其核心

本篇继续讨论 通用编程语言。 说明&#xff1a;本阶段的所有讨论都是围绕这一主题展开的&#xff0c;但前面的讨论分成了三个大部分&#xff08;后面列出了这一段的讨论题目的归属关系&#xff09;-区别distinguish&#xff08;各别&#xff09;&#xff1a; 文化和习俗。知识…