我有一个像这样的项目:
- 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");
返回时返回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] 删除。
我来说两句