Synergy編譯、去激活、漢化:macOS+Windows保姆級(jí)教程

補(bǔ)充(2022-12-04):
源碼和安裝包放到github上了
https://github.com/FLZeng/synergy-core/releases

最近添了一臺(tái)M1芯片的MBP,之前用的鍵鼠共享軟件Mouse without Borders沒有macOS版本,于是又想起來開源的Synergy,可以編譯一個(gè)macOS版本,順便也編譯了新版的Windows版本,并且修了源碼中的一些bug。
編譯好的文件放到藍(lán)奏云了,非技術(shù)黨用戶不用看后面的編譯教程,下載就能用:
地址:https://wwp.lanzoub.com/b02dremyd
密碼:5auq

包含三個(gè)文件:
Synergy-1.14.6-macOS-arm64.dmg是macOS的安裝包,使用于Apple Silicon(M1系列、M2);
Synergy-1.14.6-Win-x64-Installer.zip是Windows 64位的安裝包,解壓后得到msi文件(因?yàn)樗{(lán)奏云不支持上傳msi格式);
Synergy-1.14.6-Win-x64-Portable.zip是Windows 64位便攜版,解壓免安裝,直接運(yùn)行synergy。
macOS版和Windwos便攜版運(yùn)行為桌面程序模式(Desktop),可以在應(yīng)用首選項(xiàng)中最小化到托盤;Windows安裝版運(yùn)行為服務(wù)模式(Service),安裝后會(huì)注冊(cè)一個(gè)Windows服務(wù),首次配置后不再需要啟動(dòng)圖形界面,后臺(tái)服務(wù)自動(dòng)運(yùn)行。

1. 獲取源碼
從Github代碼倉(cāng)庫(kù)獲取,當(dāng)前最新版本是1.14.6:
git clone https://github.com/symless/synergy-core.git

2. macOS平臺(tái)編譯Synergy
編譯過程主要參考官方文檔:https://github.com/symless/synergy-core/wiki/Compiling,但是有一些坑。
2.1 安裝xcode
直接從App Store安裝xcode,會(huì)自動(dòng)裝上開發(fā)工具鏈。安裝后要打開一次,選擇同意license,然后就不用管了。
2.2 安裝brew
brew是macOS的包管理工具,后面要用它來安裝一些依賴包。直接執(zhí)行官方腳本會(huì)報(bào)錯(cuò),需要先把腳本下載下來,把里面的源改成國(guó)內(nèi)源。
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh > install.sh
修改腳步里的這兩個(gè)變量,替換為中科大源:
HOMEBREW_BREW_DEFAULT_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
HOMEBREW_CORE_DEFAULT_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
然后執(zhí)行腳本安裝:
chmod a+x install.sh
sh -C ./install.sh
2.3 安裝cmake
brew install cmake libsodium
2.4 安裝OpenSSL
brew install openssl
編輯~/.zshrc,添加openssl執(zhí)行路徑:
export PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"
2.5 安裝Qt 5
2.5.1 問題
我先是安裝了最新版本的Qt 6,然后發(fā)現(xiàn)Synergy是用Qt 5寫的,編譯提示語(yǔ)法不支持,于是只好換成Qt 5。 最后一個(gè)長(zhǎng)期支持版是Qt 5.12.12,但社區(qū)預(yù)編譯的Qt是x86架構(gòu),而我M1的mac是arm64架構(gòu),雖然通過rosetta轉(zhuǎn)譯可以運(yùn)行,但編譯時(shí)就會(huì)遇到問題:
無法編譯成x86架構(gòu)的程序:因?yàn)橐蕾嚨陌∣penSSL)是arm64架構(gòu);
無法編譯成ARM64架構(gòu)的程序:因?yàn)橐溄拥腝t二進(jìn)制庫(kù)是x86架構(gòu);
只有把二者的架構(gòu)統(tǒng)一才能成功編譯。我選擇把Qt換成arm64架構(gòu)的,官方?jīng)]提供,那就自己編譯。
2.5.2 編譯安裝Qt
先裝幾個(gè)依賴:
brew install pcre2 harfbuzz freetype
編譯Qt Creator(不是必須)還要裝另外幾個(gè):
brew install ninja python
brew install --build-from-source llvm
之前安裝的Qt 5.12.12可以保留,因?yàn)槲覀冎皇切枰猘rm64版本的Qt庫(kù),Qt Creator無所謂,省得自己編譯。
然后下載Qt源碼,Qt 5的最后一個(gè)版本是5.15.6:
https://download.qt.io/archive/qt/5.15/5.15.6/single/qt-everywhere-opensource-src-5.15.6.tar.xz
解壓后進(jìn)入代碼目錄,建立一個(gè)build目錄:
cd qt-everywhere-src-5.15.6
mkdir build
cd build
配置、編譯、安裝:
../configure -release -prefix /usr/local/share/qt-5.15.6 -nomake examples -nomake tests QMAKE_APPLE_DEVICE_ARCHS=arm64 -opensource -confirm-license -skip qt3d -skip qtwebengine
make -j8
make install
編譯好的Qt就被安裝到了/usr/local/share/qt-5.15.6目錄下。編輯~/.zshrc,添加Qt執(zhí)行程序路徑:
export PATH="/usr/local/share/qt-5.15.6/bin:$PATH"
官方教程:
https://wiki.qt.io/Building_Qt_5_from_Git
2.5.3 配置Qt Creator
如果想繼續(xù)編譯Qt Creator,可以參考下面兩個(gè)文檔:
https://www.reddit.com/r/QtFramework/comments/ll58wg/how_to_build_qt_creator_for_macos_arm64_a_guide/
https://github.com/qt-creator/qt-creator/blob/master/README.md#compiling-qt-creator
也可以下載官方編譯的x86架構(gòu)的包:
https://download.qt.io/official_releases/qtcreator/
我是通過online installer安裝的。 然后打開Qt Creator,進(jìn)入?Preferences-Kits-Qt Versions?選項(xiàng)卡,點(diǎn)擊添加按鈕(或者是Link with Qt,記不清了),地址填 /usr/local/share/qt-5.15.6/bin/qmake?,會(huì)自動(dòng)識(shí)別目錄下的工具鏈,然后點(diǎn)OK完成:

進(jìn)入 Preferences-Kits-CMake 選項(xiàng)卡,點(diǎn)擊Add,Name隨便填,我是“brew CMake”,Path填 /opt/homebrew/bin/cmake:

再進(jìn)入 Preferences-Kits-Kits 選項(xiàng)卡,點(diǎn)擊Add,Compiler選 Apple Clang (arm64),Qt version選剛剛添加的 Qt 5.15.6,Cmake Tool選剛剛添加的brew Cmake,然后在Environment中加上 MAKEFLAGS=-j8,開啟多核編譯:

2.5.4 OpenSSL庫(kù)文件路徑的問題
在/etc/profile、~/.bashrc等文件中添加的環(huán)境變量,只在shell中生效,啟動(dòng)Qt Creator仍然沒有獲取到。為了讓環(huán)境變量在Qt Creator中生效,有兩種解決方法:
方法1:從shell啟動(dòng)Qt Creator
export OPENSSL_ROOT_DIR="/opt/homebrew/opt/openssl@3"
/usr/local/share/qt-5.12.12/Qt\ Creator.app/Contents/MacOS/Qt\ Creator
方法2:使用launchctl命令添加環(huán)境變量
launchctl setenv OPENSSL_ROOT_DIR "/opt/homebrew/opt/openssl@3"
然后啟動(dòng)Qt Creator就可以獲取了。
2.6 編譯Synergy
在Qt Creator中點(diǎn)擊文件-打開文件或項(xiàng)目,打開synergy-core/CMakeLists.txt:

然后在項(xiàng)目配置中選擇剛剛配置的Desktop Qt-5.15.6 kit,展開詳情,只勾選Release,然后點(diǎn)擊Configure Project:

會(huì)自動(dòng)執(zhí)行cmake,等執(zhí)行完成后,在項(xiàng)目上右鍵,點(diǎn)擊構(gòu)建,開始編譯,編譯完成后顯示cmake正常退出:

然后在synergy-core同級(jí)目錄下可以看到build-synergy-core-xxx/目錄下,生成了bin/synergy系列可執(zhí)行文件,以及bundle/Synergy.app:

2.7 命令行編譯Synergy(Optional)
也可以使用命令行編譯,這樣就不需要Qt Creator了:
cd synergy-core
mkdir build
cd build
export QT_PATH=/usr/local/share/Qt5.15.6
export PATH=$PATH:/usr/local/bin:$QT_PATH/bin
cmake -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl@3 -DOPENSSL_LIBRARIES=/opt/homebrew/opt/openssl@3/lib -DCMAKE_OSX_DEPLOYMENT_TARGET=12.6 -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE ..
make
這樣編譯的結(jié)果在synergy-core/build目錄下。
2.8 打包Synergy.app
在Synergy.app上右鍵,點(diǎn)擊顯示包內(nèi)容,然后在Contents目錄下創(chuàng)建一個(gè)MacOS目錄,把bin目錄下的二進(jìn)制文件都復(fù)制進(jìn)去:

這個(gè)時(shí)候Synergy.app就可以運(yùn)行了,但還存在問題。Synergy.app會(huì)申請(qǐng)輔助功能權(quán)限,給它授權(quán)后,實(shí)際上只授權(quán)給了主程序synergy,synergyc和synergys運(yùn)行的時(shí)候仍然會(huì)提示沒有assistive devices權(quán)限。要將Synergy.app重新簽名一下:
cd bundle
macdeployqt Synergy.app -executable="Synergy.app/Contents/MacOS/synergyc" -executable="Synergy.app/Contents/MacOS/synergys"
codesign --sign - --force --deep Synergy.app
關(guān)于簽名覆蓋可以看這幾篇文章:
https://www.idczone.net/news/3888.html/
https://zhuanlan.zhihu.com/p/363120823
將Synergy.app打包進(jìn)dmg映像文件中,用于發(fā)布。主要步驟就是通過系統(tǒng)自帶的磁盤工具創(chuàng)建一個(gè)空白映像文件,然后把Synerg.app拖進(jìn)去。如何創(chuàng)建美觀的dmg,可以看這篇文章:
https://blog.pangao.vip/Mac%E6%89%93%E5%8C%85dmg%E6%96%87%E4%BB%B6(%E6%9B%B4%E6%8D%A2%E8%83%8C%E6%99%AF%E5%9B%BE)/
Synergy的背景圖片在Synergy.app/Contents/Resources目錄下:


3. Windows平臺(tái)編譯Synergy
Windows平臺(tái)下的編譯過程在我之前的文章鼠標(biāo)共享神器Synergy的編譯打包教程里講過,這里再簡(jiǎn)單記錄一下。
3.1 編譯環(huán)境配置
配置步驟:
安裝git:
安裝Visual Studio 2019:
安裝Windows 10 SDK:
安裝Bonjour SDK for Windows:
安裝Qt 5:
安裝OpenSSL:
安裝CMake:
安裝Wix toolchain(打包用到):
3.2 編譯Synergy
編譯命令:
cd synergy-core
mkdir build
cd build
call "D:\ProgramFiles\Develop\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvarsall.bat" x64
cmake -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Release ..
msbuild synergy-core.sln /p:Platform="x64" /p:Configuration=Release /m
前面幾條命令只要執(zhí)行一次,后面每次編譯執(zhí)行最后一條命令就行。編譯后會(huì)在synergy-core\build\bin\Release目錄下生成可執(zhí)行程序,執(zhí)行synergy.exe可以測(cè)試效果。
3.3 打包Synergy.msi
打包命令:
cd synergy-core\build\installer
msbuild /p:Configuration=Release
會(huì)在synergy-core\build\installer\bin\Release目錄下生成Synergy.msi安裝包,用于發(fā)布。
3.4 OpenSSL庫(kù)的問題
以前的本版在synergy-core/ext/openssl/windows/x64/bin/目錄下是有openssl庫(kù)文件的,現(xiàn)在整個(gè)openssl目錄都沒有了,打包的時(shí)候會(huì)提示找不到openssl.exe、libssl-1_1-x64.dll、libcrypto-1_1-x64.dll這幾個(gè)文件。需要從安裝OpenSSL-Win64安裝目錄拷過來,放到synergy-core/build/bin/Release/OpenSSL目錄下。?
還有個(gè)問題是,我安裝的OpenSSL是3.0.5版本,Synergy寫死了用1.1版本,要改一下synergy-core/dist/wix/Product.wxs文件,將其中的libssl-1_1-x64.dll和libcrypto-1_1-x64.dll改為libssl-3-x64.dll和libcrypto-3-x64.dll:
<?if $(var.Platform) = x64 ?>
? <File Source="$(var.OpenSSLBinPath)/libssl-3-x64.dll"/>
? <File Source="$(var.OpenSSLBinPath)/libcrypto-3-x64.dll"/>
<?else ?>
? <File Source="$(var.OpenSSLBinPath)/libssl-3.dll"/>
? <File Source="$(var.OpenSSLBinPath)/libcrypto-3.dll"/>
<?endif ?>

4. 去除激活驗(yàn)證
Synergy驗(yàn)證邏輯涉及下面這些類:
LicenseManager ? ? // 提供激活驗(yàn)證的入口
--> AppConfig ? ? // 全局的配置參數(shù),其中包括一個(gè)SeriaKey和Edition
--> SerialKey ? ? // 保存Key的字符串、版本、過期時(shí)間等信息
--> SerialKeyType ? // Key的類型,有trial、subscription、maintenance
--> SerialKeyEdition // Key的版本,比如unregistered、basic、lite、pro、ultimate
--> SerialKeyParser ?// 解析plane serial中的版本、過期時(shí)間等信息
主要修改內(nèi)容:
去除了LicenseManager中的所有驗(yàn)證邏輯和提示消息;
將SerialKey的過期時(shí)間設(shè)置為3022年末;
將SerialKeyType固定為maintenance;
將SerialKeyEdition固定為ultimate。

5. 界面漢化
官方版本的國(guó)際化是殘缺版,很久沒有與界面改動(dòng)同步更新了。執(zhí)行下面的命令,更新國(guó)際化文件:
lupdate synergy-core/src/gui/gui.pro
會(huì)自動(dòng)抓取界面和代碼中要翻譯的文本,更新到synergy-core/src/gui/res/lang/目錄下的.ts系列文件中。我們漢化只需要修改其中的中文gui_zh-CN.ts文件。用Qt Linguist打開可以很直觀地編輯每個(gè)界面的翻譯文本:


6. 自適應(yīng)高分屏放縮
使用Qt Creator的資源編輯器打開synergy-core/src/gui/res/Synergy.qrc,添加/qt/etc前綴,然后在其下添加qt.conf文件:

編輯qt.conf文件的內(nèi)容:
[Platforms]
WindowsArguments = dpiawareness=0
最終的運(yùn)行效果:

加上改bug前前后后折騰了一周,大大小小的問題記得的都寫了,就寫到這里吧。