Followers 0

# MinGW compilation problem

## 10 posts in this topic

Hi Guys,

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

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]'
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.

0

##### 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).

1

##### 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.

0

##### 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

0

##### 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. :)

1

##### 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.

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

2

##### 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.
1

##### 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

0

##### 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.
1

##### Share on other sites

Yeah, I just download the latest yesterday. So, I'd imagine that it should be ok to do this with too.

0

## Create an account

Register a new account