我正在Visual Studio中开发一个解决方案。它目前有两个项目。
我将用大写字母表示目录或文件夹,文件名将全部小写。我的解决方案结构如下:
- 解决方案总监
- 项目库
- 源文件
- 着色器
- 着色器文件
- ProjectApp
- 源文件
- x64
- 调试
- app.exe//调试生成
- Release
- app.exe//发布内部版本
- 调试
- 项目库
在ProjectLib
中,我有一个打开和读取着色器文件的函数。以下是我的函数:
std::vector<char> VRXShader::readFile(std::string_view shadername) {
std::string filename = std::string("Shaders/");
filename.append(shadername);
std::ifstream file(filename.data(), std::ios::ate | std::ios::binary);
if (!file.is_open()) {
throw std::runtime_error("failed to open file!");
}
size_t fileSize = static_cast<size_t>(file.tellg());
std::vector<char> buffer(fileSize);
file.seekg(0);
file.read(buffer.data(), fileSize);
file.close();
return buffer;
}
这个函数是在我的VRXDevices::createPipeline
函数中调用的,这里是相关代码:
void VRXDevices::createPipeline(
VkDevice device, VkExtent2D swapChainExtent, VkRenderPass renderPass,
const std::vector<std::string_view>& shaderNames,
VkPipelineLayout& pipelineLayout, VkPipeline& pipeline
) {
std::vector<std::vector<char>> shaderCodes;
shaderCodes.resize(shaderNames.size());
for (auto& name : shaderNames) {
auto shaderCode = VRXShader::readFile(name.data());
}
// .... more code
}
名称是从我的VRXEngine::initVulkan
函数创建并传递给这个函数的,可以在这里看到:
void VRXEngine::initVulkan(
std::string_view app_name, std::string_view engine_name,
glm::ivec3 app_version, glm::ivec3 engine_version
) {
//... code
std::vector<std::string_view> shaderFilenames{ "vert.spv", "frag.spv" };
VRXDevices::createPipeline(device_, swapChainExtent_, renderPass_, shaderFilenames, pipelineLayout_, graphicsPipeline_);
}
我只使用着色器文件的名称,如vert.spv
、frag.spv
、geom.spv
等。我在这里不包括路径,因为这些路径将用作std::map<string_view, object>
的密钥。因此,我将这些名称的向量从::initVulkan
函数传递到::createPipeline()
。
在CCD_ 10内是CCD_。
至于我的问题。。。在::readFile()
中,我正在创建一个本地string
,并尝试使用适当的路径对其进行初始化。。。然后为着色器的文件名附加CCD_ 15,从这两行可以看出。。。
std::string filename = std::string("Shaders/");
filename.append(shadername);
我正试图找出合适的字符串来初始化filename
。。。Shaders/
将是名称的一部分,但它找不到文件,我不确定合适的前缀应该是什么…
我在两个项目中的工作目录如下:
- 项目应用程序->(SolutionDir(x64/Release AND$(SolutionDir(x64/Debug
- ProjectLib->(SolutionDir(x64/Release AND$(SolutionDir(x64/Debug
所以我需要返回2个目录,然后进入VRX Engine/Shader
。。。
用于导航回目录的正确字符串值是多少?
我是用"../../VRX Engine/Shaders/"
初始化filename
,还是也用"././"
,因为文件夹名称中有空格,所以我应该在VRX Engine
周围加引号吗?在将shader name
附加到filename
之前,我需要用什么初始化CCD_23?
如何在C++中正确导航目录路径
这取决于您的实现声称符合哪个C++标准
或者您可以使用哪些附加库
C++在没有目录的计算机上很有用(例如中的-一些用C++编码并用GCC编译的操作系统内核,请参阅OSDEV以获取示例(。
有关详细信息,请访问en.cppreference.com
当使用额外的开源库时,许可限制可能很重要。
如果您的实现符合C++17(以"托管"而非"独立"的方式(,请使用标准库的std::filesystem
部分。
如果您的操作系统支持Qt或POCO框架,并且允许您使用它们(例如在C++11上(,则可以使用适当的API。因此QDir
和具有Qt的相关类、Poco::Path
和具有POCO的相关类。
也许您只想为WinAPI编写代码。然后阅读它的文档(我自己从来没有在Windows上编码过,只是在POSIX或Unix上编码,例如Linux和MSDOS…(
我最初是用"../../VRX Engine/Shaders/"
正确初始化本地临时string
,然后将string_view
附加到它以打开文件。这实际上是正确的,但因为它最初不起作用,我认为它是错误的。
返回一个目录的正确字符串值应该是"../"
,至少在Windows
上,我不确定Linux
、Mac
、Android
等…
我的问题根本不在于字符串,它与我的项目中的设置有关。在构建为可执行文件的项目中,我将其工作目录分别设置为$(SolutionDir)x64/Debug
和$(SolutionDir)x64/Release
,这对于我的解决方案结构来说是正确的。
这个问题发生在我的Engine
项目中,该项目正在作为静态库构建。在其工作目录的设置中,我忘记修改Debug
和Release
构建选项。。。这些仍然被设置为Visual Studio的默认值,我认为它是(ProjectDir)
。一旦我将它们更改为$(SolutionDir)x64/Debug
和$(SolutionDir)x64/Release
以匹配我的ApplicationProject
,我就可以打开并读取文件的内容。