Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

multiple definition of namespace variable, C++ compilation

Tags:

c++

I m writing a simple Makefile which looks like this

CC=gcc
CXX=g++
DEBUG=-g
COMPILER=${CXX}
a.out: main.cpp Mail.o trie.o Spambin.o
        ${COMPILER}  ${DEBUG} main.cpp Mail.o trie.o Re2/obj/so/libre2.so

trie.o: trie.cpp
        ${COMPILER}  ${DEBUG} -c trie.cpp

Mail.o: Mail.cpp
        ${COMPILER} ${DEBUG} -c Mail.cpp

Spambin.o: Spambin.cpp
        ${COMPILER} ${DEBUG} -c Spambin.cpp

clean: 
        rm -f *.o

I have a file name config.h which is required in Mail.cpp and Spambin.cpp, so I have #include "config.h" in both Mail.cpp and Spambin.cpp. config.h looks like this:

#ifndef __DEFINE_H__
#define __DEFINE_H__

#include<iostream>

namespace config{
        int On = 1;
        int Off = 0;

        double S = 1.0;
}
#endif

But when I try to compile the code it gives me
Mail.o:(.data+0x8): multiple definition of `config::On'
/tmp/ccgaS6Bh.o:(.data+0x8): first defined here
Mail.o:(.data+0x10): multiple definition of `config::Off'
/tmp/ccgaS6Bh.o:(.data+0x10): first defined here

Can any one help me debug this?

like image 803
Global Warrior Avatar asked Jan 23 '12 12:01

Global Warrior


3 Answers

You can not assign to namespace variables in a header files. Doing that defines the variables instead of just declaring them. Put that in a separate source file and add that to the Makefile and it should work.

Edit Also, you have to make the declarations in the header file extern.

So in the header file the namespace should look like this:

namespace config{
    extern int On;
    extern int Off;

    extern double S;
}

And in the source file:

namespace config{
    int On = 1;
    int Off = 0;

    double S = 1.0;
}
like image 87
Some programmer dude Avatar answered Oct 30 '22 06:10

Some programmer dude


Take a look at Variable definition in header files

You have to put your variable definition, i.e. the value assignment in a source file or protect it with a #ifdef guard for not being defined twice when included in separate source files.

like image 41
Bernhard Avatar answered Oct 30 '22 05:10

Bernhard


In your header file, declare const your 3 variables. For example, like this :

#ifndef __DEFINE_H__
#define __DEFINE_H__

#include<iostream>

namespace config{
        const int On = 1;
        const int Off = 0;

        const double S = 1.0;
}
#endif
like image 34
kolph Avatar answered Oct 30 '22 04:10

kolph