在 Ubuntu 上使用 g++ 編譯生成的 C++ 動態庫(.so)或靜態庫(.a),直接複製到 Windows 下無法在 Visual Studio (VS) 中鏈接使用。根本原因在於兩個平台的二進制格式不兼容:Linux 採用 ELF 格式,Windows 採用 PE/COFF 格式;符號修飾、調用約定、運行時庫也截然不同。
在 Linux 上安裝 MinGW-w64 工具鏈,直接產出 Windows 專用的 .dll 和 .lib:
x86_64-w64-mingw32-g++ -shared -o mylib.dll src.cpp -static-libgcc -static-libstdc++
再用 dlltool 生成導入庫 mylib.lib,即可在 VS 中直接鏈接。
編寫 CMakeLists.txt,分別配置 Linux 和 Windows 的編譯選項,利用 add_library(mylib SHARED src.cpp) 統一管理。在 Windows 上用 CMake 生成 VS 解決方案,原生編譯最穩妥。
若必須複用現有 .so,可編寫一層 C 風格封裝,並在 Windows 上用 LoadLibrary/GetProcAddress 動態加載經 Wine 或 WSL 兼容層轉換的庫,但效能與穩定性難以保證,不推薦用於生產環境。
參考資料:CSDN 相關討論