CMake Include 和 Lib 目录

问题描述 投票:0回答:1

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
1个回答
0
投票

好的,我无法在答案中向您展示所有 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 配置时替换为实际路径。

祝你好运,玩得开心。

© www.soinside.com 2019 - 2024. All rights reserved.