Jump to content
  • Advertisement
Sign in to follow this  
DividedByZero

MinGW compilation problem

This topic is 2041 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi Guys,

 

I am just trying my hand at the MinGW compiler, to eventually try making my applications work cross platform. cool.png

 

I am just trying to convert one of my medium size projects so it will compile. I have managed to sucessfully convert the required lib's using reimp.

 

But now I am having an issue with the linker.

 

C:\Users\Jason\Desktop\MinDX>g++ main.cpp -o MinDX.exe -static-libgcc -static-li
bstdc++ -s
main.cpp: In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':
main.cpp:36:72: warning: passing NULL to non-pointer argument 4 of 'int MessageB
oxA(HWND, LPCSTR, LPCSTR, UINT)' [-Wconversion-null]
   MessageBox(NULL,"Unable to create render window.","Fatal Error!",NULL);
                                                                        ^
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x49): undefined re
ference to `Renderer::createWindow(int, int, bool, bool)'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x8e): undefined re
ference to `Renderer::getDevice()'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x9d): undefined re
ference to `D3DXCreateLine@8'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x15a): undefined r
eference to `Renderer::spriteCreate(std::string)'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x1ae): undefined r
eference to `Renderer::spriteSetX(float, std::string)'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x202): undefined r
eference to `Renderer::spriteSetY(float, std::string)'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x255): undefined r
eference to `Renderer::spriteSetSizeX(int, std::string)'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x2a8): undefined r
eference to `Renderer::spriteSetSizeY(int, std::string)'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x2fb): undefined r
eference to `Renderer::spriteSetDepth(int, std::string)'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x331): undefined r
eference to `Renderer::showWindow(bool)'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x3c2): undefined r
eference to `Renderer::counterUpdate()'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x3cc): undefined r
eference to `Renderer::renderStart()'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x3d6): undefined r
eference to `Renderer::renderSpriteQueue()'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x3e0): undefined r
eference to `Renderer::framerateGetReal()'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x4b7): undefined r
eference to `Renderer::renderDebugText(int, int, std::string)'
C:\Users\Jason\AppData\Local\Temp\ccpvSbJs.o:main.cpp:(.text+0x4d8): undefined r
eference to `Renderer::renderEnd()'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\J
ason\AppData\Local\Temp\ccpvSbJs.o: bad reloc address 0xf in section `.text$_ZN6
SpriteC1Ev[__ZN6SpriteC1Ev]'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link
 failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

 

From what I can tell the compiler can't find my engine.cpp file (my engine.h file references the above functions).

 

engine.h & engine.cpp are located in the same folder and I know the compiler can see engine.h (called from main.cpp) as this is where I had to fix up my header files.

 

I am a long time user of MSVC++ and first time user of MinGW 4.6 (or any version for that matter). So, I am probably missing something simple.

 

Any help would be greatly appreciated. smile.png

Share this post


Link to post
Share on other sites
Advertisement

You need to actually pass all your source files. i.e.:

>g++ main.cpp engine.cpp otherfiles.cpp -o MinDX.exe -static-libgcc -static-libstdc++ -s

Otherwise they won't get compiled. The header files can be found because they are included on-demand via #include directives and the current working directory is implicitly searched for header files, but due to the modular nature of object files you usually compile each source file separately and then link them together (which can be done in a single command as given above, but usually you prefer to create a makefile or use an IDE to only recompile source files which changed so that you don't restart the compilation from scratch every single time).

Share this post


Link to post
Share on other sites

You need to actually pass all your source files. i.e.:

>g++ main.cpp engine.cpp otherfiles.cpp -o MinDX.exe -static-libgcc -static-libstdc++ -s

Otherwise they won't get compiled. The header files can be found because they are included on-demand via #include directives and the current working directory is implicitly searched for header files, but due to the modular nature of object files you usually compile each source file separately and then link them together (which can be done in a single command as given above, but usually you prefer to create a makefile or use an IDE to only recompile source files which changed so that you don't restart the compilation from scratch every single time).

 

Ahh, ok. Thanks for that. I'll give that a try now.

 

I am used to VC++ doing everything. Makes you lazy and not know what is actually going on behind the scenes. smile.png

Share this post


Link to post
Share on other sites

Ok, it is looking good. But, just having troubles linking to the DX libs that I exported with reimp. It says it cant find them.

 

c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -libd3d9.a
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -libd3dx9.a
collect2.exe: error: ld returned 1 exit status

 

Ths is my compilation command.

 

g++ main.cpp engine.cpp sprite.cpp -o MinDX.exe -static-libgcc -static-libstdc++ -LC:\MinGW\DXSDK\lib -libd3d9.a -libd3dx9.a -s

 

The files are sitting in C:\MinGW\DXSDK\lib

 

Thanks again for your help. smile.png

Share this post


Link to post
Share on other sites

I think you want -ld3d9 and -ld3dx9, the "-l" part is actually the command and the "lib" prefix and ".a/.dll/.so" etc.. extension are automatically added. I'm not sure why it's designed that way, probably historical reasons smile.png but yeah you only want to pass "-l" + the name of the library without the "lib" prefix and the extension, the compiler does the rest.

Share this post


Link to post
Share on other sites

Thanks Bacterius.

 

Everything is working great now! Glad you guys know the idiosyncrasies of MinGW. I would never have thought of that. smile.png

 

It's not MinGW in particular, all C/C++ compilers work that way - even command-line MSVC I believe. IDE's just hide that smile.png

Share this post


Link to post
Share on other sites
Just a note - I use the vanilla .lib forms of DX that ship with the SDK with gcc without issues, so no need to convert to .a files.

In that case just supply the full file name of the lib file including the extension.

Share this post


Link to post
Share on other sites

Just a note - I use the vanilla .lib forms of DX that ship with the SDK with gcc without issues, so no need to convert to .a files.

In that case just supply the full file name of the lib file including the extension.

 

Seriously? That is awesome to know. I read that you needed to convert dll's made by MS.So this is great smile.png  

Share this post


Link to post
Share on other sites

Just a note - I use the vanilla .lib forms of DX that ship with the SDK with gcc without issues, so no need to convert to .a files.
In that case just supply the full file name of the lib file including the extension.

 
Seriously? That is awesome to know. I read that you needed to convert dll's made by MS.So this is great :)

Yeah I thought that too. Used to be the case but I tried it last year and it worked.

Not sure what gcc version you need though. I use one we use at work built from a very recent source.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!