User forums > Help
Undefined reference
nonoitall:
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;
}
--- End code ---
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");
}
--- End code ---
DefaultOutput.h
--- Code: ---#ifndef _DEFAULTOUTPUT_H_
#define _DEFAULTOUTPUT_H_
void CreateDefaultOutput();
#endif
--- End code ---
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]
Jenna:
--- Quote from: nonoitall on October 09, 2008, 12:01:35 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++.
--- End quote ---
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
--- End code ---
above your declaration, and
--- Code: ---#ifdef __cplusplus
}
#endif
--- End code ---
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
--- End code ---
nonoitall:
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. :)
thomas:
--- Quote from: nonoitall on October 09, 2008, 01:06:23 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.
--- End quote ---
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.
MortenMacFly:
--- Quote from: thomas on October 09, 2008, 05:37:30 pm ---I'm using that wizard every day, and it works 100% reliably.
--- End quote ---
Erm... I must become blind. Did I truly read you praise a wizard???
May I mark this in red, bold, please? :lol: :lol: :lol:
Navigation
[0] Message Index
[#] Next page
Go to full version