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.pswp.cn/bicheng/72792.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72792.shtml
英文地址,請注明出處:http://en.pswp.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; 文化和習俗。知識…