Technical-Issues

如何在 Fedora 中從 GOG 啟動 Linux 版本的 X3: Reunion?

  • April 27, 2021

嗨,我最近從GOG購買了Linux版本的X3:Reunion,但是我找不到啟動它的方法。

我的系統: Fedora 32、64 位版本

我通過終端進入 X3 Reunion 文件夾並通過以下方式啟動它:

./start.sh

這給了我:

./X3R_config: error while loading shared libraries: libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory

我查看了文件夾/usr/lib/libgtk-x11-2.0.so.0在那裡。

然後我想,哦,我忘了安裝GOG頁面上列出的程序。

分別是:

需要安裝以下軟體包:libc6:i386 libasound2:i386 libasound2-data:i386 libasound2-plugins:i386 libgtk2.0-0:i386 libxml2:i386 和依賴項。此遊戲僅附帶 32 位二進制

通過網際網路研究,我想我找到了相應的 Fedora 程序並安裝了它們:

  • glibc-devel.i686,它安裝了 libxcrypt-devel.i686 作為依賴
  • alsa-lib.i686(已安裝)
  • alsa-lib-devel.i686
  • alsa-plugins-pulseaudio.i686(因為 pulseaudio 是唯一安裝在 64 位版本中的,我認為這將是這個遊戲的版本)
  • gtk2.i686,它安裝了 atk.i686、gdk-pixbuf2-modules.i686 和 jasper-libs.i686 作為依賴項
  • libxml2.i686
  • libxml2-devel.i686,它安裝了 cmake-filesystem.i686、xz-devel.i686、xz-devel.x86_64 和 zlib-devel.i686 作為依賴項

然後我嘗試再次開始遊戲,這次我得到了:

./X3R_config: lib/libz.so.1: version `ZLIB_1.2.9' not found (required by /lib/libpng16.so.16)

通過一些研究,我來到了這個網站: https ://stackoverflow.com/questions/48306849/lib-x86-64-linux-gnu-libz-so-1-version-zlib-1-2-9-not-成立

並嘗試了第二種解決方案:

cd /your_software/../lib/ (the directory containing libz.so.1)
mv libz.so.1 libz.so.1.old
ln -s /lib/x86_64-linux-gnu/libz.so.1

因為在 Fedora 中是 nolib/x86_64-linux-gnu/我發現對應的文件夾應該是lib64

所以我做了:

cd /usr/lib/
sudo mv libz.so.1 libz.so.1.old
sudo ln -s /lib64/libz.so.1

可悲的是,這沒有幫助。


最近我在 GOG 的 Linux 版 Mount & Blade: Warband 中遇到了類似的情況,它在啟動後給了我這樣的資訊:

error while loading shared libraries: libcurl-gnutls.so.4: cannot open shared object file: No such file or directory

但是《騎馬與砍殺:戰團》的解決方案是:

sudo ln -s /usr/lib64/libcurl.so.4 /usr/lib64/libcurl-gnutls.so.4

騎馬與砍殺:戰團在那之後正常開始。

也許這有助於或將提供一個額外的想法如何讓 X3: Reunion 開始……


如果我忘記了我會添加它,我只使用 Linux 進行瀏覽和一些辦公/遊戲,所以歸根結底,我只是一個初學者;)

先感謝您。


小更新

因此,我將 libz.so.1(我從 @aphid 顯示的原始碼編譯的)放入~/GOG Games/X3 Reunion/game/lib/文件夾中,但將之前的重命名libz.so.1libz.so.1.old.

然後我得到了:

./start.sh 
Running X3: Reunion
Language detected: English
./X3R_config: symbol lookup error: /lib/libxcb-shm.so.0: undefined symbol: xcb_send_request_with_fds

這導致我:

這個

有人有同樣的問題,但對於 X3 人族戰爭。

嗯,是的,這是另一款遊戲,但同一個系列,所以我認為以下方法可能有效:

解決方案是刪除遊戲根文件夾中的 lib 文件夾(位於 docs、game、start.sh…. 旁邊的那個)並保留在遊戲中的 lib 文件夾中,僅包含:

libavcodec.so.53
libavformat.so.53
libavutil.so.51
libbz2.so.1.0
libcrypto.so.1.0.0
libGLEW.so.1.13
libswscale.so.2

當然,我在執行此操作之前保存了~/GOG Games/X3 Reunion/liband~/GOG Games/X3 Reunion/game/lib/

這讓我:

./start.sh 
Running X3: Reunion
Language detected: English
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
X Error of failed request:  GLXBadContext
 Major opcode of failed request:  153 (GLX)
 Minor opcode of failed request:  6 (X_GLXIsDirect)
 Serial number of failed request:  107
 Current serial number in output stream:  106

這導致我尋找failed to load driver: swrast這個:

答案#6

所以也許 32-bit-nvidia-libs 可能會有所幫助,或者它們會與目前的 64-bit-libs 衝突嗎?X3: Reunion 畢竟是一款 32 位的遊戲。

目前安裝的 64 位軟體包:

akmod-nvidia-340xx
kmod-nvidia-340xx-5.11.11-100.fc32.x86_64
kmod-nvidia-340xx-5.11.12-100.fc32.x86_64
kmod-nvidia-340xx-5.11.14-100.fc32.x86_64
nvidia-texture-tools
xorg-x11-drv-nvidia-340xx
xorg-x11-drv-nvidia-340xx-kmodsrc
xorg-x11-drv-nvidia-340xx-libs
xorg-x11-drv-nvidia-libs

然後我會安裝 .i686 的…

或者這個選項會是死胡同嗎?


更新 2

好的,現在安裝了 32 位 nvidia 庫,它現在開始了。從這裡得到幫助 。

還發現它會在您刪除/重命名~/GOG Games/X3 Reunion/lib文件夾時啟動。您可以將所有文件保留在~/GOG Games/X3 Reunion/game/lib/文件夾中,但我們必須將 libz.so.1 與之前編譯的文件一起切換。

我現在將在答案部分寫一個詳細的答案。

那麼,我是如何讓 X3: Reunion 在 Fedora 上執行的:

1.) 安裝以下軟體包:

glibc-devel.i686
 which should install as dependencies:
   libxcrypt-devel.i686
alsa-lib.i686
alsa-lib-devel.i686
alsa-plugins-pulseaudio.i686
gtk2.i686
 which should install as dependencies:
   atk.i686, gdk-pixbuf2-modules.i686 and jasper-libs.i686
libxml2.i686
libxml2-devel.i686
 which should install as dependencies:
   cmake-filesystem.i686, xz-devel.i686, xz-devel.x86_64 and zlib-devel.i686 

2.) 從這裡獲取舊的 zlib 版本並編譯它。

# Create a directory to house the source code
mkdir ~/zlib129/
mkdir ~/zlib129/source/
# Create a directory to house the output of the compilation
mkdir ~/zlib129/chroot/
# Go into the directory
cd ~/zlib129/source/
# Download the zlib archive
wget https://zlib.net/fossils/zlib-1.2.9.tar.gz
# Extract it, skipping the root folder. 
tar -xvzf zlib-1.2.9.tar.gz --strip-components=1
# Let's check out how to compile it
nano makefile.in
### Read the instructions on how to compile...
./configure 
make install prefix=/home/YourUsername/zlib129/chroot/
### Move the library to where we want it. 
### But rename the old one first.
mv ~/GOG Games/X3 Reunion/game/lib/libz.so.1 ~/GOG Games/X3 Reunion/game/lib/libz.so.1.old
mv ~/zlib129/chroot/lib/libz.so.1 ~/GOG Games/X3 Reunion/game/lib/libz.so.1

3.) 安裝 nvidia 32 位庫或僅安裝您各自的 gpu 驅動程序 32 位庫,在這個答案中,我將介紹 nvidia 之一。

只是:

sudo dnf install xorg-x11-drv-nvidia-340xx-libs.i686 

或者

sudo dnf install xorg-x11-drv-nvidia-libs.i686

後一個似乎適用於較新的 gpu,而第一個適用於我的 gpu,我有一個相當舊的 gpu。如果您也應該有一個較舊的 gpu,但不是 340 版本的驅動程序,只需將 340 替換為您的版本。

4.) 然後刪除 ~/GOG Games/X3 Reunion/lib 文件夾或重命名它並開始遊戲。

就是這樣,祝你游戲愉快。


特別感謝來自這裡的 aphid 和來自 FedoraForum 的 PabloTwo。


研究來源是:

https://stackoverflow.com/questions/48306849/lib-x86-64-linux-gnu-libz-so-1-version-zlib-1-2-9-not-found

https://www.gog.com/forum/x_series/x3_terran_war_linux_shared_library_issues

https://bbs.archlinux.org/viewtopic.php?pid=1864555#p1864555

https://forums.fedoraforum.org/showthread.php?326065-Will-32-bit-nvidia-libraries-interfere-with-the-64-bit-ones

除了正常的zlib (x64) 之外,您還應該安裝zlib.i686,並(強制)您的遊戲連結到它。它可能會立即執行,或者您可能必須使用符號連結來讓遊戲載入正確的庫版本。

我需要的舊版本的zlib沒有安裝程序了,我如何從原始碼安裝?

如果遊戲專門尋找 1.2.9(一個過時的版本),那麼雖然我們可以嘗試使用更新的版本,但這可能會導致錯誤或崩潰(儘管我認為這不太可能;這是一個應該想要的壓縮庫向後兼容)。所以安裝包並不容易,這意味著你必須自己編譯程式碼。

為此,您需要一個編譯器。看看文件Makefile.in。它包含編譯程序的所有指令。它似乎也是用 編寫的C,所以我們需要一個 C 編譯器。如果您還沒有這些,我建議您安裝gcc或通過您的包管理器安裝。clang

我建議創建一個工作目錄(在這個例子中:)~/zlib129/。如果你偏執,你可以 chroot 進入這個目錄,以防止執行編譯程式碼的任何命令影響系統的其餘部分。然後繼續執行的命令如下所示:

# Creates a directory to house the source code
mkdir ~/zlib129/
mkdir ~/zlib129/source/
# Create a directory to house the output of the compilation
mkdir ~/zlib129/chroot/
# Go into the directory
cd ~/zlib129/source/
# Download the zlib archive
wget https://zlib.net/fossils/zlib-1.2.9.tar.gz
# Extract it, skipping the root folder. 
tar -xvzf zlib-1.2.9.tar.gz --strip-components=1
# Let's check out how to compile it
nano makefile.in
### Read the instructions on how to compile...
./configure 
make install prefix=/home/grubbel/zlib129/chroot/
### Move the library to where we want it. 
### One easy thing to just do is put it in the game's lib folder (if it has one preconfigured). 
mv ~/zlib129/chroot/lib/libz.so.1 /path/to/game/lib/libz.so.1

注意:如果您設法編譯了庫,但遊戲在其自己的文件夾中找不到它,請嘗試使用LD_LIBRARY_PATH我評論中的環境變數技巧。

您的解決方案不起作用的原因:

除了許多版本之外,系統庫通常有兩種風格。通常這兩種風格(64 位和較舊的 32 位)放在不同的文件夾中。通常類似於/libvs /lib64。由於歷史原因,發行版對此沒有相同的命名約定。

通過對其進行符號連結,您正在嘗試將 64 位庫載入到 32 位二進製文件中。這不起作用,因為指針大小不同。指針是所有 C 和 C++ 程序都必須用來在彼此之間傳遞變數(例如帶有數據或文本的緩衝區)的東西。

指針是指向記憶體中某個位置的數字;虛擬記憶體中的第 N 個字節。32 位(或i686,來自無處不在的 32 位Intel處理器系列 286..386..486 等的名稱),顧名思義,程序使用 32 位寬度或 4 字節的指針. 另一方面,64 位程序使用寬度為 64 位或 8 字節的指針。

因此,當 zlib 需要一個指向要壓縮(壓縮)的字元串的指針時,它需要一個 64 位地址。如果你給它一個 32 位地址,它會出現分段錯誤(作業系統終止試圖訪問不存在或不允許的記憶體的程序)並崩潰,因為其他 32 位將被隨機垃圾填充。反過來也是如此:遊戲將無法解釋從庫返回的 64 位地址,因為它不適合變數。

很可能您的連結器甚至不允許您這樣做,並且會大聲向您抱怨,而不是讓您的應用程序停止並著火。

為什麼有時我必須對這些庫進行符號連結?

製作這款遊戲時並沒有考慮到有一天在同一系統上可能會使用多種指針大小。它也是在 linux 系統上製作的,其中庫可能已經在/lib而不是/usr/lib,這可能是硬編碼的。現在有更多的 linux 發行版,而且約定也發生了變化。事情通常有效,但您可能需要擺弄舊程序才能正常執行。

程式時,64 位 PC還不存在。就它而言,指針是一個 32 位無符號整數。事實上,很多遊戲開發者甚至會犯這個錯誤並隨意轉換為有符號整數,這就是為什麼一些老遊戲一達到 2GiB 記憶體就會崩潰,以及為什麼 Windows 有一個特殊的標誌,程序員需要在32 位應用程序允許超過 2GiB 記憶體。

引用自:https://gaming.stackexchange.com/questions/384408