CSFML D:缺少符号错误



我使用官方的(动态)D绑定到CSFML (https://github.com/BindBC/bindbc-sfml)。

作为先决条件,我使用以下命令安装CSFML 2.5(我的操作系统是Linux):

sudo apt-get install libcsfml-dev

然后我将动态库导入到我的项目中,键入以下代码开始…

主要代码:

import std.stdio;
import bindbc.sfml;
import bindbc.loader;
import std.string;
import std.conv;
import loader = bindbc.loader.sharedlib;
void loadDyn() {
if (!loadSFML()) {
string[] messages;
foreach (const(ErrorInfo) err; loader.errors) {
string errorStr = to!string(err.error);
string messageStr = to!string(err.message);
messages ~= format("Error: %s, Message: %s", errorStr, messageStr);
}
throw new Exception(format("Fatal error(s) encountered whilst calling `loadSFML()` function: %s %s %s", messages, loadedSFMLSystemVersion(), loadedSFMLGraphicsVersion()));
}
}
void main() {
loadDyn();
sfContextSettings* settings;
sfRenderWindow* window = sfRenderWindow_create(sfVideoMode(640, 480), "Hi", sfWindowStyle.sfDefaultStyle, settings);
while (window.sfRenderWindow_isOpen()) {
sfEvent event;
while (window.sfRenderWindow_pollEvent(&event)) {
if (event.type == sfEventType.sfEvtClosed) {
window.sfRenderWindow_close();
}
}
window.sfRenderWindow_clear(sfBlack);
window.sfRenderWindow_display();
}
}

dub.json

{
"authors": [
"Tom"
],
"dependencies": {
"bindbc-sfml": "~>1.0.1",
"bindbc-loader": "~>1.0.0"
},
"versions": [
"SFML_Audio",
"SFML_Graphics",
"SFML_250"
],
"description": "A minimal D application.",
"license": "proprietary",
"name": "sfml"
}

运行程序,得到以下错误:

object.Exception@source/app.d(20): 
Fatal error(s) encountered whilst calling `loadSFML()` function: [
"Error: Missing Symbol, Message: sfRenderTexture_createWithSettings", 
"Error: Missing Symbol, Message: sfRenderTexture_getMaximumAntialiasingLevel", 
"Error: Missing Symbol, Message: sfText_getLineSpacing", 
"Error: Missing Symbol, Message: sfText_getLineSpacing"
] sfml250 sfml240
----------------
source/app.d:20 void app.loadDyn() [0x55d6ef8b19c2]
source/app.d:25 _Dmain [0x55d6ef8b19e4]
Program exited with code 1

我在网上寻求帮助,图书馆的主人告诉我通过调用loadedSFMLSystemVersion()loadedSFMLGraphicsVersion()函数来检查我的SFML系统和SFML图形版本。

loadedSFMLSystemVersion()函数返回2.5.0,loadedSFMLGraphicsVersion()返回2.4.0。版本冲突

绑定的所有者对这个问题是这样说的:

通常,加载配置版本失败是因为安装了较低版本的C库(例如,您要求安装2.5,但只安装了2.4)。但情况并非总是如此。也可能是因为绑定中存在错误,或者因为编译共享库时不支持特定函数,或者共享库以某种方式损坏了。

那么,回到你的具体情况。尽管CSFML apt包可能会捆绑一个版本的CSFML图形库和另一个版本的其他所有内容,但这似乎不太可能。CSFML 2.5意味着所有东西的2.5。看看官方的apt存储库列表,它们显示该软件包包含所有功能的2.5个。您可以通过查找系统上的共享库来验证这一点,但是没有必要。我肯定你已经安装了2.5。

此外:

我在这个阶段的第一个想法是寻找绑定中的错误。也许函数名拼错了。但事实并非如此。

所以我的下一个想法是检查共享库。可能构建配置错误,导致丢失的功能无法正确导出。

库的所有者建议版本冲突是由于内部问题/错误,我无法正确找到,因为它超出了我的范围。

由于某些原因,降级到2.4版本修复了这个问题,但我想使用2.5版本,由于这些错误,我无法使用。

查看设置系统版本的代码

看起来loadedSFMLSystemVersion返回的值将总是您为该版本定义的任何值(它只是将值设置为config.d中定义的enum),无论库是否支持。

所以我不认为这个不匹配是错误的指示。似乎正在发生的事情是,加载图形绑定的代码没有找到声明支持2.5所需的一个或多个函数。

看这里的函数列表,至少有一个没有加载。

查看第一条错误消息,它是列表中的第一个函数。实际上,我想说的是,这个库看起来确实不是2.5版本,而是2.4版本。

我不熟悉这个库,但我要检查的第一件事是你是否有正确的。so文件。要做到这一点,请尝试:

dpkg -L libcsfml-dev

这可能会告诉您安装的库版本。

如果你认为这是正确的版本,试着在。so文件上使用nm,看看你是否能找到定义在那里的符号。如果没有,那么构建的库就不包含该函数。这可能是因为bindbc绑定中的函数名不正确,也可能正如作者所说——库不是用该函数构建的。

最新更新