gpt4 book ai didi

c++ - Cmake中的资源文件夹

转载 作者:行者123 更新时间:2023-12-02 10:10:41 28 4
gpt4 key购买 nike

我有一个这样的项目:

- root/
- main/
- include/
- *.h
- res/
- *.txt
- src/
- *.c
CMakeListst.txt
- CMakeLists.txt
res文件夹是我的应用程序读取的包含一堆文本文件的文件夹。
这就是我的 root/CMakeLists.txt好像:
// Configuration stuff

add_subdirectory(main)
然后 root/main/CMakeLists.txt好像:
include_directories(include)

file(GLOB_RECURSE SOURCES *.c)
file(GLOB_RECURSE RESOURCES *.txt)
add_executable(${PROJECT_NAME} ${RESOURCES} ${SOURCES})
我以为我可以将所有资源添加到 add_executable声明,但后来我调试了我的程序,当我尝试打开文件时发现它崩溃了。假设我有一个名为 foo.txt 的文件在 res/文件夹,然后当我执行 fopen("foo.txt", "r");它返回空值。如何添加自定义资源?

最佳答案

相信你误会了什么add_executable做。它通常只会将其中指定的文件传递给编译器。
因为编译器大概不知道如何处理你的 foo.txt ,它会忽略它(实际上我很惊讶它没有提示)。你的 CMakeLists 文件中发生的事情大致相当于

gcc src/*.c res/*.txt 
...这可能会清楚为什么它没有按照您的意愿执行(如果您熟悉 gcc,则不确定您的平台)。
那么,如何“添加”资源呢?嗯,有多种方法:
  • 如果您从 root/main 运行可执行文件目录,你可以像这样打开它:

  • FILE* my_file = fopen("res/foo.txt", "r");
    或以其他方式提供文件的相对或完整路径。这可能是最好的方法。
  • 您可以让 cmake 将您的“foo.txt”复制到构建目录(然后执行我在前一点中所说的操作)。这样,相对于您的可执行文件,它始终位于同一个位置。 Here's a link I found that explains this fairly well
  • 您可以将资源直接嵌入到二进制文件中。我个人不会这样做,除非有一个很好的理由说明其他人不能使用。一般来说,这也应该只对非常小的资源进行。我只是为了完整起见把它放在这里。可以做到这一点的图书馆是 hexembed .
  • 关于c++ - Cmake中的资源文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63661787/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com