【发布时间】:2020-12-14 06:08:15
【问题描述】:
上下文:我想为 Linux、Windows 和 MacOS 创建一个 GameClient、GameServer 和自定义库(客户端和服务器都使用)跨平台。服务器和客户端都依赖于我更喜欢静态链接的各种库和标题。我听说我可以通过将我目前 VisualStudio 开发的 3 个项目包装到 CMake 环境中来做到这一点,所以我首先为 Server 和 Shared lib 制作 CMakeLists.txt,它们是最简单的并且具有较少的库依赖项。
问题:如何调整这些 CMakeLists.txt(目前在 Windows 上构建),以便我可以选择是为 Windows 还是 Linux(最好是从 Windows)编译? p>
共享库 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(MORPH_Server VERSION 1.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(SFML_STATIC_LIBRARIES TRUE) #Link to statically
set(SFML_DIR "C:/libraries/SFML/SFMLx64SourceAndCompile")
find_package(SFML 2.5.1 COMPONENTS system network REQUIRED)
add_library(MORPH_Shared_Functions)
target_sources(MORPH_Shared_Functions
PRIVATE Transform.cpp
PRIVATE World.cpp
PRIVATE Player.cpp
PRIVATE PropsData.cpp
PRIVATE Prop.cpp
PRIVATE udp_network_manager.cpp
PRIVATE utility_functions.cpp
)
target_link_libraries(MORPH_Shared_Functions
sfml-system #Basically already found sfml modules and their dependencies (find-package)
sfml-network
)
target_include_directories(MORPH_Shared_Functions
PRIVATE C:/libraries/SFML/SFML-2.5.1/include
PRIVATE C:/libraries/GLM/glm
PRIVATE C:/libraries/CEREAL
)
服务器 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(MORPH_Server VERSION 1.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
configure_file(CmakeConfig.h.in CmakeConfig.h)
set(SFML_STATIC_LIBRARIES TRUE) #Link to statically
set(SFML_DIR "C:/libraries/SFML/SFMLx64SourceAndCompile")
find_package(SFML 2.5.1 COMPONENTS system network REQUIRED)
add_executable(MORPH_Server)
target_sources(MORPH_Server
PRIVATE Main.cpp
PRIVATE Game.cpp
PRIVATE CommandManager.cpp
PRIVATE ServerPlayer.cpp
PRIVATE ServerProp.cpp
PRIVATE ServerWorldState.cpp
PRIVATE UDP_Server_CS.cpp
)
add_library(MORPH_Shared_Functions STATIC IMPORTED)
set_target_properties(MORPH_Shared_Functions PROPERTIES IMPORTED_LOCATION C:/Users/dylan/Desktop/MORPH/MORPH_Shared_Functions/Build/Debug/MORPH_Shared_Functions.lib)
target_link_libraries(MORPH_Server
MORPH_Shared_Functions
sfml-system
sfml-network
)
target_include_directories(MORPH_Server
PRIVATE C:/Users/dylan/Desktop/MORPH/MORPH_Shared_Functions
PRIVATE C:/libraries/SFML/SFML-2.5.1/include
PRIVATE C:/libraries/GLM/glm
PRIVATE C:/libraries/CEREAL
)
【问题讨论】:
-
您可能希望从删除
set(SFML_DIR "C:/libraries/SFML/SFMLx64SourceAndCompile")和使用 c:/ 的其他部分开始。 -
通过用 Linux 系统上的路径替换它们?所以我可以为 Linux 编译我的项目的唯一方法实际上是在 Linux 上执行 cmake?我无法按照我的要求从 Windows 执行此操作?
-
您要求交叉编译。这与 CMake 关系不大……你需要一个交叉编译器设置。
-
在 Windows 上执行此操作的一种方法是使用 WSL,尽管您仍然在 linux 上执行此操作。
-
一般来说,这不值得麻烦。交叉编译器设置是棘手的问题。如果您想干净利落,您将需要一台 Linux 机器(或双启动或虚拟机)来测试您的二进制文件,那么为什么不将它也用于构建呢? 这样可以减少很多头痛。