【问题标题】:Resource Folder In CmakeCmake中的资源文件夹
【发布时间】:2020-08-30 20:22:51
【问题描述】:

我有一个这样的项目:

- 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 语句中,但后来我调试了我的程序,当我尝试打开文件时发现它崩溃了。假设我在res/ 文件夹中有一个名为foo.txt 的文件,然后当我执行fopen("foo.txt", "r"); 时它返回null。如何添加自定义资源?

【问题讨论】:

  • fopen 与 Cmake 没有任何共同之处。您要归档什么?

标签: c++ c cmake


【解决方案1】:

我相信你误解了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

【讨论】:

  • 感谢您的详细解答!唯一的事情是,如果我给出一个完整的路径,那么它现在可以在另一台机器上工作。如何制定一条适用于任何地方的标准路径?
  • 然后按照我在第二个要点中所说的操作,让 cmake 将文件复制到可执行目录。然后您可以将您的程序与 res 文件夹一起发送 :)
猜你喜欢
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多