Author Topic: Undefined reference  (Read 7811 times)

Offline nonoitall

  • Single posting newcomer
  • *
  • Posts: 3
Undefined reference
« on: October 09, 2008, 12:01:35 pm »
To save time, my problem is pretty much identical to this unsolved one.  I get an undefined reference when using a function from another source file, despite having a prototype included from a header file.  And this is an issue with Code::Blocks.  I can plug exactly the same code into Dev-C++ and it compiles perfectly, so don't tell me that I need to go and learn C++.  The following source files are relevant:

main.c
Code
#include <windows.h>
#include <stdio.h>
#include "DefaultOutput.h"

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

char szClassName[] = "LinampSlaveClass";

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) {

HWND hwnd;    /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */

/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;   /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof(WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0;   /* No extra bytes after the window class */
wincl.cbWndExtra = 0;   /* structure or the window instance */
/* Use Windows's default colour as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl)) return 0;

/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
   0,    /* Extended possibilites for variation */
   szClassName, /* Classname */
   "Linamp Slave",    /* Title Text */
   WS_OVERLAPPEDWINDOW, /* default window */
   CW_USEDEFAULT,    /* Windows decides the position */
   CW_USEDEFAULT,    /* where the window ends up on the screen */
   544, /* The programs width */
   375, /* and height in pixels */
   HWND_DESKTOP, /* The window is a child-window to desktop */
   NULL, /* No menu */
   hThisInstance,    /* Program Instance handler */
   NULL /* No Window Creation data */
   );

/********************************************************
*********************************************************

The next line is where I get the undefined reference

*********************************************************
********************************************************/

CreateDefaultOutput(); //Here's where I get the error

/* Make the window visible on the screen */
ShowWindow (hwnd, nCmdShow);

/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0)) {
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {

switch (message) { /* handle the messages */
case WM_DESTROY:
PostQuitMessage (0);    /* send a WM_QUIT to the message queue */
break;
default:   /* for messages that we don't deal with */
return DefWindowProc(hwnd, message, wParam, lParam);
}

return 0;
}


DefaultOutput.c
Code
#include "DefaultOutput.h"
#include <stdio.h>

void CreateDefaultOutput() {
printf("Here I am creating default output... or not, because I can't be called.\n");
}

DefaultOutput.h
Code
#ifndef _DEFAULTOUTPUT_H_
#define _DEFAULTOUTPUT_H_

void CreateDefaultOutput();

#endif

I've also included the project and source files.  Is there any way to get around this issue?

EDIT: I also forgot to mention that the source files are all included in my project.

[attachment deleted by admin]
« Last Edit: October 09, 2008, 12:04:49 pm by nonoitall »

Offline Jenna

  • Administrator
  • Lives here!
  • *****
  • Posts: 7252
Re: Undefined reference
« Reply #1 on: October 09, 2008, 12:30:09 pm »
I can plug exactly the same code into Dev-C++ and it compiles perfectly, so don't tell me that I need to go and learn C++.

Why not?

You mix C and C++, that's not correct. (I don't know why Dev-C++ links them correctly, it should not, or it treats both files incorrectly as "c" or "c++"-files.

The main-file has the ending .cpp and will compiled using c++, but your second-file is a "C"-file.
"C" and "C++" do not use the same naming-scheme.

You have to declare your function as "C"-function in the header-file.

Put
Code
#ifdef __cplusplus
extern "C"
{
#endif
above your declaration, and
Code
#ifdef __cplusplus
}
#endif
below.

Here's how the whole file should look like:
Code
#ifndef _DEFAULTOUTPUT_H_
#define _DEFAULTOUTPUT_H_

#ifdef __cplusplus
extern "C"
{
#endif
    void CreateDefaultOutput();
#ifdef __cplusplus
}
#endif

#endif

Offline nonoitall

  • Single posting newcomer
  • *
  • Posts: 3
Re: Undefined reference
« Reply #2 on: October 09, 2008, 01:06:23 pm »
Wow I didn't even notice that was a cpp file.  In that case, I suppose the bug is that Code::Blocks creates a C++ file despite my telling it to create a C file.  I changed it manually and now it works, so thanks.  :)

Offline thomas

  • Administrator
  • Lives here!
  • *****
  • Posts: 3979
Re: Undefined reference
« Reply #3 on: October 09, 2008, 05:37:30 pm »
In that case, I suppose the bug is that Code::Blocks creates a C++ file despite my telling it to create a C file.
No, you're lying :) Other than the console wizard, the Win32 project wizard does not ask you what to create at all. Therefore, if you used the Win32 wizard, there is no way you could have told it to make the main file a C source. It copies the main file, which happens to be .cpp, from the template directory.
On the other hand, if you used the console wizard and added the Windows stuff by hand, you did not tell it to create a C source. That's quite certain because I'm using that wizard every day, and it works 100% reliably.
"We should forget about small efficiencies, say about 97% of the time: Premature quotation is the root of public humiliation."

Offline MortenMacFly

  • Administrator
  • Lives here!
  • *****
  • Posts: 9723
Re: Undefined reference
« Reply #4 on: October 09, 2008, 06:18:00 pm »
I'm using that wizard every day, and it works 100% reliably.
Erm... I must become blind. Did I truly read you praise a wizard???
May I mark this in red, bold, please? :lol: :lol: :lol:
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: https://www.codeblocks.org/docs/main_codeblocks_en.html
C::B FAQ: https://wiki.codeblocks.org/index.php?title=FAQ

Offline nonoitall

  • Single posting newcomer
  • *
  • Posts: 3
Re: Undefined reference
« Reply #5 on: October 09, 2008, 11:16:03 pm »
No, you're lying :) Other than the console wizard, the Win32 project wizard does not ask you what to create at all. Therefore, if you used the Win32 wizard, there is no way you could have told it to make the main file a C source. It copies the main file, which happens to be .cpp, from the template directory.
On the other hand, if you used the console wizard and added the Windows stuff by hand, you did not tell it to create a C source. That's quite certain because I'm using that wizard every day, and it works 100% reliably.
Guess you'll have to tack that down to 99%, because in a console project I created, it created a C++ file despite my selecting C.  (I tested that prior to posting my second time.)

In any case, is there a reason why the user can't select what type of project he wants when creating a Windows project?  It's not like everyone out there prefers C++ over C.

Offline MortenMacFly

  • Administrator
  • Lives here!
  • *****
  • Posts: 9723
Re: Undefined reference
« Reply #6 on: October 10, 2008, 08:48:40 am »
In any case, is there a reason why the user can't select what type of project he wants when creating a Windows project?  It's not like everyone out there prefers C++ over C.
The wizard can be easily extended in that way. You might want to do that and provide a patch.

Right-click on the Win32 wizard and select "Edit" as a starter... Then read the WiKi section(s) about wizards / scripting.
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: https://www.codeblocks.org/docs/main_codeblocks_en.html
C::B FAQ: https://wiki.codeblocks.org/index.php?title=FAQ

Offline thomas

  • Administrator
  • Lives here!
  • *****
  • Posts: 3979
Re: Undefined reference
« Reply #7 on: October 10, 2008, 09:27:53 am »
Erm... I must become blind. Did I truly read you praise a wizard???
May I mark this in red, bold, please? :lol: :lol: :lol:
Only thing I'm saying is that it works exactly as it is intended. Not saying that's a good thing.
I still hate wizards and would still prefer a system like we had 3 years ago, one that doesn't ask a thousand things, but simply pukes a bunch of files into a directory  :)
"We should forget about small efficiencies, say about 97% of the time: Premature quotation is the root of public humiliation."