I'm a C newbie and I was just trying to write a console application with Code::Blocks. Here's the (simplified) code: main.c:
#include <stdio.h>
#include <stdlib.h>
#include "test.c" // include not necessary for error in Code::Blocks
int main()
{
//t = test(); // calling of method also not necessary
return 0;
}
test.c:
void test() {}
When I try to build this program, it gives the following errors:
*path*\test.c|1|multiple definition of `_ test'| obj\Debug\main.o:*path*\test.c|1|first defined here|
There is no way that I'm multiply defining test (although I don't know where the underscore is coming from) and it seems highly unlikely that the definition is somehow included twice. This is all the code there is.
I've ruled out that this error is due to some naming conflict with other functions or files being called test or test.c. Note that the multiple and the first definition are on the same line in the same file.
Does anyone know what is causing this and what I can do about it? Thanks!
The underscore is put there by the compiler and used by the linker. The basic path is:
So, your main program should include the header file for the test module which should consist only of declarations, such as the function prototype:
This lets the compiler know that it exists when main.c is being compiled but the actual code is in test.c, then test.o.
It's the linking phase that joins together the two modules.
By including test.c into main.c, you're defining the test() function in main.o. Presumably, you're then linking main.o and test.o, both of which contain the function test().
If you're using Visual Studio you could also do "#pragma once" at the top of the headerfile to achieve the same thing as the "#ifndef ..."-wrapping. Some other compilers probably support it as well .. .. However, don't do this :D Stick with the #ifndef-wrapping to achieve cross-compiler compatibility. I just wanted to let you know that you could also do #pragma once, since you'll probably meet this statement quite a bit when reading other peoples code.
Good luck with it
Including the implementation file (
test.c
) causes it to be prepended to your main.c and complied there and then again separately. So, the functiontest
has two definitions -- one in the object code ofmain.c
and once in that oftest.c
, which gives you a ODR violation. You need to create a header file containing the declaration oftest
and include it inmain.c
:You actually compile the source code of
test.c
twice:test.c
itself,main.c
which includes all thetest.c
source.What you need in your
main.c
in order to use thetest()
function is a simple declaration, not its definition. This is achieved by including atest.h
header file which contains something like:This informs the compiler that such a function with input parameters and return type exists. What this function does ( everything inside
{
and}
) is left in yourtest.c
file.In main.c, replace
#include "test.c"
by#include "test.h"
.A last point: with your programs being more complex, you will be faced to situations when header files may be included several times. To prevent this, header sources are sometimes enclosed by specific macro definitions, like:
You shouldn't include other source files (*.c) in .c files. I think you want to have a header (.h) file with the DECLARATION of test function, and have it's DEFINITION in a separate .c file.
The error is caused by multiple definitions of the test function (one in test.c and other in main.c)
I had similar problem and i solved it following way.
Solve as follows:
Function prototype declarations and global variable should be in test.h file and you can not initialize global variable in header file.
Function definition and use of global variable in test.c file
if you initialize global variables in header it will have following error
Just declarations of global variables in Header file no initialization should work.
Hope it helps
Cheers