为 Linux 编译时 Assimp aiString 为空

Assimp aiString empty when compiling for Linux

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

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

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

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

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

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

在朋友的帮助下,我能够通过临时添加 "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 upgrade,因为它会尝试将你系统上的所有软件包升级到 Ubuntu 的新版本,可能会有不可预见的后果s.

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

sudo apt-get update

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

感谢 Dominic Barnes 的这些步骤和说明:https://whosebug.com/users/188702/dominic-barnes