Cmake中的资源文件夹

Higigig

我有一个像这样的项目:

- 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.txtres/文件夹中有一个名为文件,然后当我fopen("foo.txt", "r");返回返回null。如何添加自定义资源?

里恩科

我相信您会误解add_executable通常它将只是将其中指定的文件传递给编译器。

由于编译器可能不知道如何处理您的代码foo.txt,因此它会忽略它(我很惊讶它没有抱怨)。CMakeLists文件中发生的事情大致等同于类似

gcc src/*.c res/*.txt 

...这可能很清楚地说明了为什么它没有按照您想要的去做(如果您熟悉gcc,则不确定您的平台)。

那么,如何“添加”资源?好吧,有多种方法:

  • 如果从root/main目录运行可执行文件,则可以像下面这样打开它:
FILE* my_file = fopen("res/foo.txt", "r");

或以其他方式提供文件的相对或完整路径。这可能是最好的方法。

  • 您可以使cmake将您的“ foo.txt”复制到构建目录(然后执行我在上一点中提到的内容)。这样,相对于可执行文件,它始终位于同一位置。这是我发现的链接,可以很好地解释这一点

  • 您可以直接将资源嵌入二进制文件中。我个人不会这样做,除非有很好的理由不能使用其他人通常,这也仅应在非常小的资源上执行。我只是为了完整性而将其放在这里。可以执行此操作的库已嵌入

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

WinForms如何打开资源文件夹中的文件

在资源文件夹Android中读取CSV文件

访问资源文件夹.Net 3.5中的文件

无法访问资源文件夹中的文件

Android Studio中的素材资源文件夹?

Eclipse中的Java资源文件夹错误

Bitrise中的AndroidTest资源文件夹

无法访问Java中的资源文件夹

引用资源文件夹而不是jar中的内容

在Unity中向资源文件夹添加路径

访问jar中的资源文件夹

如何从资源文件夹中删除Android徽标

未找到项目路径中的资源文件夹

未加载资源文件夹中的HEIC图像

如何在gradle和其他资源文件夹中添加资源文件夹

Java:从资源文件夹内文件夹中的txt文件读取

Maven:在war版本中将文件夹包含在资源文件夹中

从资源文件夹JAVA获取文件夹

在Android程序包中访问资源文件夹和原始文件夹中的文件列表

如何从资源文件夹中获取文件作为文件?

从 java 中的资源文件夹访问文件(运行 JavaScript 文件)

如何在Spring Boot中访问src / main / resources /文件夹中的资源文件

将xml文件存储在资源文件夹(WAR)中,从代码中读取

如何使用gradle复制classes文件夹中的资源文件?

Java的无法找到资源文件夹中的文本文件

Gradle:接受src / main / java文件夹中的资源文件

如何从SpringBoot应用程序的资源文件夹中读取所有文件?

将路径传递到资源文件夹中的文件以定义Spring Bean

SpringBoot v1.5.14.RELEASE-从测试资源文件夹中读取文件