我不太熟悉CMake,仍然觉得它很令人困惑。我有一个项目,有一个服务器和客户端,我希望能够相互独立运行,但构建到同一个目录(具体来说,顶级项目构建目录有点像游戏的服务器启动器和游戏启动器在同一目录)目前它只是在每个子项目中创建一个构建目录,所以一个在客户端,一个在服务器等。
这是我当前的项目结构
.
├── CMakeLists.txt
├── builds
│ ├── debug
│ └── release
├── client
│ ├── CMakeLists.txt
│ ├── assets
│ └── source
│ └── Main.cpp
├── documentation
├── libraries
│ ├── glfw-3.3.7
│ └── glm
├── server
│ ├── CMakeLists.txt
│ └── source
│ └── Main.cpp
└── shared
├── PlatformDetection.h
├── Utility.h
├── events
└── platform
├── linux
├── macos
└── windows
这是我的根CMake文件
cmake_minimum_required(VERSION 3.20)
project(Game VERSION 1.0.0)
add_subdirectory(libraries/glfw-3.3.7)
add_subdirectory(client)
add_subdirectory(server)
客户端CMake文件
cmake_minimum_required(VERSION 3.20)
project(Launcher LANGUAGES CXX VERSION 1.0.0)
set(CMAKE_CXX_STANDARD 23)
set(SOURCE_FILES source/Main.cpp ../shared/events/Event.h ../shared/Utility.h
source/Client.cpp source/Client.h ../shared/PlatformDetection.h ../shared/events/EventManagementSystem.cpp
../shared/events/EventManagementSystem.h)
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
include_directories(${CMAKE_SOURCE_DIR}/libraries/glm)
include_directories(${CMAKE_SOURCE_DIR}/libraries/glfw-3.3.7/include/GLFW)
include_directories(${CMAKE_SOURCE_DIR}/shared)
add_executable(Launcher ${SOURCE_FILES})
target_link_libraries(Launcher LINK_PUBLIC glfw)
Server CMake文件
cmake_minimum_required(VERSION 3.20)
project(ServerLauncher LANGUAGES CXX VERSION 1.0.0)
set(CMAKE_CXX_STANDARD 23)
set(SOURCE_FILES source/Main.cpp ../shared/events/Event.h ../shared/Utility.h
../shared/PlatformDetection.h ../shared/events/EventManagementSystem.cpp
../shared/events/EventManagementSystem.h)
include_directories(${CMAKE_SOURCE_DIR}/libraries/glm)
include_directories(${CMAKE_SOURCE_DIR}/shared)
add_executable(ServerLauncher ${SOURCE_FILES})
如何使客户端和服务器构建到同一目录?这些能使文件结构得到改善吗?它们看起来很乱,对我来说到处都是,尽管这可能只是因为我不熟悉CMake。
您不能让多个子目录使用相同的构建目录,但这似乎不是您想要实现的。
假设您没有在项目的任何地方设置变量CMAKE_RUNTIME_OUTPUT_DIRECTORY
,并且您没有通过其他方式为任何目标指定RUNTIME_OUTPUT_DIRECTORY
目标属性,那么您可以在使用add_subdirectory
之前简单地在顶层CMakeLists.txt
设置变量:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
add_subdirectory(...)
...
注意,对于分发程序,您应该使用install()
逻辑:
客户机CMakeLists.txt
...
install(TARGETS Launcher RUNTIME)
服务器CMakeLists.txt
...
install(TARGETS ServerLauncher RUNTIME)
注意,您可能需要添加安装依赖项的逻辑。
使用这些install
命令允许您使用
cmake --install <build dir> --prefix <install dir>
将程序本地安装到系统上默认的二进制文件目录中。此外,它是使用cpack
打包项目的基础。