CMakeList.txt
cmake_minimum_required(VERSION 3.29)
project(raylibPhysicsEngine)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(PROJECT_SOURCES ${CMAKE_CURRENT_LIST_DIR}/src/main.c)
这就是我的 CMake 知识范围。 这是我当前的 CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(raylibPhysicsEngine)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
include(FetchContent)
set(FETCHCONTENT_QUIET FALSE)
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(BUILD_GAMES OFF CACHE BOOL "" FORCE)
FetchContent_Declare(
raylib
GIT_REPOSITORY "https://github.com/raysan5/raylib.git"
GIT_TAG "master"
GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable(raylib)
file(GLOB_RECURSE PROJECT_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_LIST_DIR}/src/*.cpp")
set(PROJECT_SOURCES
"${CMAKE_CURRENT_LIST_DIR}/src/main.c"
"src/ds.c"
)
add_executable(${PROJECT_NAME}
src/macros.h)
target_sources(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCES})
target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_INCLUDE})
target_link_libraries(${PROJECT_NAME} PRIVATE raylib ${PROJECT_LIB})
target_compile_definitions(${PROJECT_NAME} PUBLIC ASSETS_PATH="${CMAKE_CURRENT_SOURCE_DIR}/assets/")
我从视频教程中复制了这个,我不记得知道什么,但问题是我希望能够使用 cmake 从 include 目录和 lib 目录获取文件。 也许只是我,但我尝试过的所有 CMake 学习资源都没有帮助我。
我已尽我所能,但我只是不明白这些东西的一半意味着什么以及它的作用,并且文档非常有帮助。我知道 make 并且我将它用于我的大多数与 c 相关的项目。
我需要的只是 cmake 从 lib 目录中获取 raylib 以及我决定但在 include 和 lib 中的任何其他标头和库。更重要的是你能解释一下这些函数在做什么而不是说输入这个吗?
我现在的fs是:
├───include
│ macros.h
│ stb_ds.h
│ typedef.h
│
├───lib
│ ds.c
│
└───src
main.c
CMakeLists.txt
好的,我无法在答案中向您展示所有 CMake,但我可以快速引导您完成您的这个示例,然后我建议您查看 优秀的教程 Modern CMake
cmake_minimum_required(VERSION 3.0)
project(raylibPhysicsEngine)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
这些是显而易见的。请记住,某些 cmake 命令需要位于项目命令之前或之后,否则它们将不起作用(有时没有错误,非常烦人)。例如,编译器相关变量就是这种情况。 我通常在 CMakeLists 的这一部分中包含的另一个命令是
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
include(FetchContent)
set(FETCHCONTENT_QUIET FALSE)
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(BUILD_GAMES OFF CACHE BOOL "" FORCE)
FetchContent_Declare(
raylib
GIT_REPOSITORY "https://github.com/raysan5/raylib.git"
GIT_TAG "master"
GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable(raylib)
这告诉 cmake 从这个 git 存储库下载 master 分支并将其包含在构建中。由于
raylib
恰好也是一个 cmake 项目,因此它提供了可用于构建您自己的代码的目标。
file(GLOB_RECURSE PROJECT_SOURCES CONFIGURE_DEPENDS
"${CMAKE_CURRENT_LIST_DIR}/src/*.cpp")
这会递归地搜索指定的路径/正则表达式来查找 cpp 文件,并将它们保存在名为
PROJECT_SOURCES
的列表中
set(PROJECT_SOURCES
"${CMAKE_CURRENT_LIST_DIR}/src/main.c"
"src/ds.c"
)
现在这个用这 2 个 c 文件覆盖
PROJECT_SOURCES
。我希望用 list(APPEND PROJECT_SOURCES ... )
代替
add_executable(${PROJECT_NAME}
src/macros.h)
target_sources(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCES})
CMake 的精髓来了。我们要求它创建一个名为
PROJECT_NAME
的可执行文件。 macros.h
不是编译文件,但最好将其包含在目标构建文件列表中,以便 CMake 可以跟踪它们的修改并根据需要重新编译。 target_sources
命令可以说太冗长了,在 ${PROJECT_SOURCES}
之后添加
macros.h
就足够了
target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_INCLUDE})
在
${PROJECT_INCLUDE}
中搜索包含文件
target_link_libraries(${PROJECT_NAME} PRIVATE raylib ${PROJECT_LIB})
将可执行文件与
raylib
(可通过之前的 FetchContent
命令获得)和 ${PROJECT_LIB}
(未在您向我们展示的文件中指定)链接。请记住,如果 ${PROJECT_LIB}
不存在,CMake 不会抱怨(我认为),这就是使用目标(例如 raylib
)而不是变量名的原因之一
target_compile_definitions(${PROJECT_NAME} PUBLIC
ASSETS_PATH="${CMAKE_CURRENT_SOURCE_DIR}/assets/")
最后,它指定了
-DASSETS_PATH="${CMAKE_CURRENT_SOURCE_DIR}/assets/"
。 ${CMAKE_CURRENT_SOURCE_DIR}
在 cmake 配置时替换为实际路径。
祝你好运,玩得开心。