SFML community forums

Help => General => Topic started by: MOP on October 11, 2017, 02:55:52 pm

Title: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: MOP on October 11, 2017, 02:55:52 pm
Hello folks,

this is my first topic in this forum. First of all my english is not very good.  ;D

Iam actually playing with the C-SFML Libary. Iam coding in C. Iam dont rly know C++, so thats why.

Former i used the SDL Libary, which was easy. C-SFML seems also to be very easy.

Actually i try to put some Example Shader(Edge Detection from the Examples), to a picture. Just for testing in my own gui. But i just failing first for the blend mode...

I use the latest codeblocks and csfml version, with mingw32.

Code: [Select]
bool MenuPlaceIMG(int x, int y, bool type, int id)
{
    // Initialisieren
    if(!CSFMLIsInit || !mstate.isInit)
        return false;

    sfSprite *sprite = sfSprite_create();
    sfShader *shader = sfShader_createFromFile(NULL, NULL, "edge.frag");
    sfRenderStates state;

    if(shader == NULL || sprite == NULL)
    {
        printf("Shader oder Sprite kann nicht geladen werden!");
        return false;
    }

    sfVector2f position = {x, y};
    sfSprite_setPosition(sprite, position);

    sfShader_setFloatUniform(shader, "edge_threshold", 1.0f);

    // Bild zeichnen
    if(type == false)
    {
        sfSprite_setTexture(sprite, media.header, sfTrue);
        sfTexture_setSmooth(media.header, sfTrue);
        sfShader_setTextureUniform(shader, "texture", media.header);

        state.blendMode = sfBlendAdd;
        state.shader = shader;
        state.texture = media.header;
        state.transform = sfTransform_Identity;
    }
    else
    {
        sfSprite_setTexture(sprite, media.bg[id].background, sfTrue);
        sfTexture_setSmooth(media.bg[id].background, sfTrue);
        sfShader_setTextureUniform(shader, "texture", media.bg[id].background);

        state.blendMode = sfBlendAdd;
        state.shader = shader;
        state.texture = media.bg[id].background;
        state.transform = sfTransform_Identity;
    }

    sfRenderWindow_drawSprite(screen, sprite, &state);

    // Speicher freigeben
    sfShader_destroy(shader);
    shader = NULL;
    sfSprite_destroy(sprite);
    sprite = NULL;

    return true;
}

If i tryn compile this, i got some linker errors, and iam actually sure, that i linked all libarys...

My errors:
Code: [Select]
|249|undefined reference to `_imp__sfBlendAdd'|
|252|undefined reference to `_imp__sfTransform_Identity'|
|260|undefined reference to `_imp__sfBlendAdd'|
|263|undefined reference to `_imp__sfTransform_Identity'|
||error: ld returned 1 exit status|

By The way, when i want to use the default Colors like sfBlack or something, i get the same errors.

My Link-Libarys sequence are the following
Audio
Network
Graphics
Window
System

Anyone an idea to fix this?

Thank you all in advance for help or tips.

Greetings MOP
Title: Re: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: eXpl0it3r on October 11, 2017, 03:36:15 pm
You shouldn't add SFML to the global Code::Blocks compiler settings, but configure your project settings.
Additionally you should define the path where the libraries are located and then only specify the names of the libraries. See the official SFML tutorials to get the idea.

Where did you get CSFML from?
Title: Re: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: MOP on October 11, 2017, 03:57:14 pm
I got CSFML from here: https://www.sfml-dev.org/download/csfml/

I updated my settings, but i still get the errors. Same Settings for Build, the xxx-d suffix for debug as said in the tutorial wont work.

Edit:
I got it work now. But i need to self define variables.
I just put this to my code
Code: [Select]
const sfBlendMode sfBlendAdd = { sfBlendFactorSrcAlpha, sfBlendFactorOne, sfBlendEquationAdd, sfBlendFactorOne, sfBlendFactorOne, sfBlendEquationAdd };
    const sfTransform sfTransform_Identity = { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
This is from officially documentation.
Title: Re: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: eXpl0it3r on October 11, 2017, 04:41:23 pm
Have you maybe not updated the header files properly? Does your include/SFML/Graphics/BlendMode.h contain the mentioned symbols?
Title: Re: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: MOP on October 11, 2017, 04:57:02 pm
My Header File Contain the following:
Its the same like on this: https://github.com/SFML/CSFML/blob/master/include/SFML/Graphics/BlendMode.h
Code: [Select]
...
CSFML_GRAPHICS_API const sfBlendMode sfBlendAlpha;    ///< Blend source and dest according to dest alpha
CSFML_GRAPHICS_API const sfBlendMode sfBlendAdd;      ///< Add source to dest
CSFML_GRAPHICS_API const sfBlendMode sfBlendMultiply; ///< Multiply source and dest
CSFML_GRAPHICS_API const sfBlendMode sfBlendNone;     ///< Overwrite dest with source
...

The self define things i got from this file:
https://github.com/SFML/CSFML/blob/master/src/SFML/Graphics/BlendMode.cpp

Title: Re: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: eXpl0it3r on October 11, 2017, 05:09:52 pm
The MinGW import files (*.a) were created based off the MSVC import files (*.lib) and it seems like the conversion tool for whatever reason dropped those symbols.
I'm no expert on this topic, but when looking at both files in a text editor, the mentioned symbols can be found in the *.lib file, but can't be found in the *.a file. They can also be found in the *.dll itself.

If you know how to generate an import file based off a *.lib and *.dll file, you might be able to generate non-broken *.a files.

Will certainly keep that in mind for future releases.
Title: Re: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: MOP on October 11, 2017, 05:25:47 pm
That sounds logic
Please donot forget the same with
The Default Colors
SfBlack
SfWhite

and so on..

I will try to built up directly the .a's liabray with the source.
And if successfully, I will test it and post updates here.
Title: Re: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: MOP on October 13, 2017, 01:21:17 pm
Hey,

some update from me about linking.

If you built up a 32 Bit project, MinGW supports for 32 Bit also *.lib libarys, i tested it. But i just got the same error, with the default Colors / Blend Modes.

Another try, i used the converter tool LIB2A. This tool generate a .def File without these symbols...

It seems the Tool just generates symbols, which has some functions

Like:
...
sfTestSymbol ---struct
sfTestSymbol_FunctionTest ---function to the struct
sfTestSymbol_FunctionTest2 ---another function to the struct
...

All of these symbols are exported.

If you got:
...
sfTestSymbol1 ---struct
sfTestSymbol2 ---struct
sfTestSymbol3 ---struct
...
sfTestSymbol4 ---struct
sfTestSymbol4_Explode ---function to the struct
...

It just export the last 2 Symbols and ignores the first 3.

And the converter uses the .def file to generate an .a file.
If i open the .a lib with 7zip (a tip from me, if you want to see Symbols in a,lib,dl file).
I only see the symbols in my .a file which was defined in the .def File.

It is maybe a bug in LIB2A tool, or desired?


I try to put manually missing symbols to the .def file and post for update.


Title: Re: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: eXpl0it3r on October 13, 2017, 01:25:56 pm
Will it's no surprise that you find the same result that way, since I've also used the LIB2A tool, but it might well be that it doesn't handle all symbols.
Title: Re: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: MOP on October 13, 2017, 01:34:06 pm
i was successfully, now the tool generated a good .a file.

I put all missing symbols from the graphics libary manually to the .def file. My compiling and linking now works good.

In my attachment you find the .def file and the .a file.

Edit:
Some things got my attention, in your Source Code
https://github.com/SFML/CSFML/tree/master/src/SFML/Graphics

All exported "Structs" got his own ExampleStruct.h File.
On the other Side, such like BlendModes or Colors, got no own .h File.
The defines are in the .cpp file. Maybe there's a problem?

Iam not the expert on C++ and your code of course, but it is maybe an idea ?!
Title: Re: C-SFML - Getting some Linker Error: undefined reference to `_imp__sfBlendAdd'
Post by: eXpl0it3r on June 02, 2018, 02:54:52 am
If anyone ever stumbles up on this topic and gets curious how to easily solve it.

It took a while, but I finally figured out that MinGW-w64 ships with a tool called gendef.exe which does a proper export of DLL to DEF file. From there you can take the dlltool.exe that also ships with MinGW-w64.

In summary, here's a bat file that converts all the CSFML libs - I know it's quite hardcoded, but hey it works. :D

set dll_file= csfml-system-2.dll
set def_file= csfml-system-2.def
set   a_file= libcsfml-system.a

gendef.exe %dll_file%
dlltool.exe -d %def_file% -D %dll_file% -l %a_file%

set dll_file= csfml-window-2.dll
set def_file= csfml-window-2.def
set   a_file= libcsfml-window.a

gendef.exe %dll_file%
dlltool.exe --export-all-symbols -d %def_file% -D %dll_file% -l %a_file%

set dll_file= csfml-graphics-2.dll
set def_file= csfml-graphics-2.def
set   a_file= libcsfml-graphics.a

gendef.exe %dll_file%
dlltool.exe --export-all-symbols -d %def_file% -D %dll_file% -l %a_file%

set dll_file= csfml-network-2.dll
set def_file= csfml-network-2.def
set   a_file= libcsfml-network.a

gendef.exe %dll_file%
dlltool.exe --export-all-symbols -d %def_file% -D %dll_file% -l %a_file%

set dll_file= csfml-audio-2.dll
set def_file= csfml-audio-2.def
set   a_file= libcsfml-audio.a

gendef.exe %dll_file%
dlltool.exe --export-all-symbols -d %def_file% -D %dll_file% -l %a_file%

Also finally updated the CSFML download packages, so this issue shouldn't occur anymore!
For those interested, I wrote a short blog post (https://dev.my-gate.net/2018/06/02/generate-a-def-file-from-a-dll/) about it.