How to setup D with SFML? (using bindbc-sfml)

Ki Rill rill.ki at yahoo.com
Tue Apr 11 10:24:09 UTC 2023


On Sunday, 9 April 2023 at 14:20:30 UTC, Mike Parker wrote:
> I've tried your project out two ways, one that succeeds and one 
> that fails. I'm guessing you've put your 'libs' directory is 
> 'bin/libs'. Am I right? If so, then the following should help 
> you.
>
Well, `bin/` and `libs/` are in the same directory.

> When dub runs the exectuable, it sets the current working 
> directory to the project's root directory by default. 
> `setCustomLoaderPath` passes whatever you give it directly to 
> the system API unmodified. You've passed a relative path. By 
> default, the system API associates relative paths with the 
> current working directory.
>
> So given a project root directory of `$ROOT`, and your 
> executable in `$ROOT/bin`, the system is looking for the 
> libraries in `$ROOT/libs` and *not* in `$ROOT/bin/libs`. If the 
> libs are in the former, everything loads. If they're in the 
> latter, then it's going to fail.
>
> If you cd into `bin` and run the executable manually, then libs 
> in `$ROOT/bin/libs` will load, as your current working 
> directory is `bin`.
>
> The quick fix for this is to add `"workingDirectory" : "bin"` 
> to your dub.json. Then your relative paths will be relative to 
> `$ROOT/bin/`.
>

I tried `bin/libs/` as well as you describe here. It did not work.

---

Actually, it is quite strange that it fails to load the 
[CSFML](https://www.sfml-dev.org/download/csfml/) library dlls in 
`libs/` (I download CSFML2.5) since that is what I do with 
[GLFW/OpenGL](https://github.com/rillki/d-glfw-opengl-project-template) example as well for Windows 10.

**Even this fails: `loadSFMLGraphics("libs/csfml-graphics.dll")`**

I have the following structure:
```
- bin/
- libs/
- source/
- dub.json
- dub.selections.json
```

My `dub.json`:
```Json
{
	"authors": [
		"rillki"
	],
	"copyright": "Copyright © 2023, rillki",
	"dependencies": {
		"bindbc-sfml": "~>1.0.2"
	},
	"description": "D/SFML project template",
	"license": "BSL",
	"name": "d-sfml-project-template",
	"targetPath": "bin",
	"versions": [
		"SFML_Audio",
		"SFML_Graphics",
		"SFML_Network",
		"SFML_System",
		"SFML_Window",
		"SFML_250"
	]
}
```

My `source/app.d`:
```d
module app;

import std.stdio: writeln;
import bindbc.sfml;

void main() {
     version(Windows) {
         import bindbc.loader;
         setCustomLoaderSearchPath("libs");
     }

     // attempt at loading sfml
     if(!loadSFML()) {
         writeln("Failed to load SFML library!");
         return;
     }

     // window dimensions
     enum width = 720;
     enum height = 480;
     enum title = "D/SFML project";

     // create window
     auto window = sfWindow_create(sfVideoMode(width, height), 
title.toStringz, sfWindowStyle.sfDefaultStyle, null);
     scope(exit) { sfWindow_destroy(window); }

     while(sfWindow_isOpen(window)) {
         // process events
         sfEvent event;
         while(sfWindow_pollEvent(window, &event)) {
             if(event.type == sfEventType.sfEvtClosed) {
                 sfWindow_close(window);
             }
         }

         // ...
     }
}

```

I will try to make it work... Meanwhile, if someones spots what I 
am doing wrong, please reply to this post.


More information about the Digitalmars-d-learn mailing list