c++ - 针对 Linux 编译时 Assimp aiString 为空

标签 c++ linux opengl cross-platform assimp

我正在开发一个简单的 OpenGL 项目,而且我是 C++ 新手。我一直在慢慢地向一个非常简单的原始 3D“引擎”添加功能,并努力确保它可以跨平台编译。

我有一个针对 OSX 和 Linux (Ubuntu) 运行的 make 文件,对于 Windows,我有一个经过修改的 Visual Studio 解决方案文件以使用项目的目录结构。

每次我进行更改时,我都会确保在每个平台上进行编译和测试,直到我使用 Assimp 添加对加载模型的支持之前,一切都很棒。更具体地说,加载模型很好,但加载纹理才是导致问题的原因,或者更确切地说,读取纹理文件名。

奇怪的是,这段代码实际上可以在我所针对的所有平台上正确运行和编译:Linux (Ubuntu)、OSX 和 Windows 10 - 除了在 Ubuntu 中(并且仅在 Ubuntu 中)aiString 来自 Assimp 的对象似乎没有返回纹理文件的名称。

这是我缩小范围的代码片段,它真正显示了我的问题:

aiString path;
mat->GetTexture(aiTextureType_DIFFUSE, 0, &path);
fprintf(stderr, "Loading texture '%s'...\n", path.data);   
std::string full_path = _model_load_path + std::string(path.C_Str());
fprintf(stderr, "Full path: '%s'\n", full_path.c_str());   

这是 OSX 和 Windows 10 上的输出:

Loading texture 'glass_dif.png'...
Full path: 'resources/meshes/nanosuit/glass_dif.png'

这是 Ubuntu 上的输出:

Loading texture ''...
Full path: 'resources/meshes/nanosuit/'

果然,纹理已在 OSX 和 Windows 10 中正确加载并应用到模型,但在 Ubuntu 中则不然。其他一切似乎都有效,包括加载模型(它仅显示为黑色,因为着色器无法对纹理颜色进行采样)。

我唯一能想到的是我安装的 libassimp-dev 版本,它是 4,而 OSX 上是 5。但我对 v4 持怀疑态度,之前所有版本都无法加载纹理。难道是我编译的方式不对?

我应该开始研究什么来解决这个问题?我在 Ubuntu 上使用 gcc,在 OSX 上使用 clang。

最佳答案

好吧,为了尽职调查,我决定首先排除 libassimp-dev 版本,因为这确实是唯一不同的地方。我怀疑这就是这个问题,因为以前版本的 libassimp-dev 是如何在 Linux 上工作的?

嗯,我不知道,但这就是问题所在。我避免这样做,因为 Ubuntu 上的版本 5 不适用于我的 Linux 版本:https://packages.ubuntu.com/search?keywords=libassimp-dev

在 friend 的帮助下,我能够通过临时添加“focal”软件包存储库来强制安装版本 5,从该新存储库安装相关软件包,然后删除该存储库,这样 Ubuntu 就不会升级其他所有软件包系统。

步骤:

1.) 将以下配置附加到 /etc/apt/sources.list:

# FIXME: remove me after installing libassimp5 and libassimp-dev
deb http://mirrors.kernel.org/ubuntu focal main universe

2.) 更新包注册表并安装相关包(及其依赖项):

sudo apt-get update
sudo apt-get install libassimp-dev libassimp5

(我还遇到一个问题,运行此命令后我必须运行推荐的修复安装命令或类似命令)

3.) 安装成功后,删除添加到 /etc/apt/sources.list

中的行

请确保您现在不运行 sudo apt-get update,因为它会尝试将系统上的所有软件包升级到新版本的 Ubuntu,这可能会产生不可预见的后果s。

4.) 再次更新您的包注册表(以删除新存储库的痕迹)

sudo apt-get update

工作后重新编译我的项目 - 字符串正确显示 Material 文件路径,应用程序加载纹理并将它们正确应用到模型。

这些步骤和说明归功于 Dominic Barnes:https://stackoverflow.com/users/188702/dominic-barnes

关于c++ - 针对 Linux 编译时 Assimp aiString 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60580853/

相关文章:

c++ - 仅发布版本的大量链接器问题

c++ - 全屏 SDL 中的 Alt-tab

c++ - 是否可以让 multi_index 容器使用连续内存?

c++ - 在 C++ 中连接两个 WCHAR_T 数组

linux - 操作系统中可用的 Linux 文档资源到底有哪些?

openGL-绘制四边形网格并手动绘制它们

c++ - OpenGL:如何缩放并将其位置(X,Y)保持在之前的位置

c++ - Typedef 泛化

linux - 如何使用 crond 而不是 atd?

linux - 在bash中使用sed写入变量指定的行号