variável externa causa erro de múltipla definição

Eu tenho tentado usar extern para usar variável que é definida anteriormente.

Eu não usei extern antes e agora eu preciso usá-lo para definir a variável apenas uma vez e usá-los em vários arquivos

Eu escrevi a versão minimizada do código para esta questão. Eu tenho quatro arquivos

lib.h

#ifndef LIB_H
#define LIB_H

#include <iostream>

namespace lib {

  extern bool initialized;

  bool initialized = false;

  static void isInit(char* parent) {
    std::cout << "Library for [" << parent << "] initialized? " << (::lib::initialized ? "yes" : "no") << "\n";
  }
} // namespace lib
#endif

vehicle.h

#ifndef _VEHICLE_H
#define _VEHICLE_H
#include <string>

class Vehicle {
  public:
    Vehicle(const std::string& manufacturer,
            const std::string& model,
            int year);
    std::string manufacturer;
    std::string model;
    int year; 
};
#endif

A seguir está a implementação do arquivo vehicle.h chamado vehicle.cpp

#include "vehicle.h"

#include "lib.h"

Vehicle::Vehicle(const std::string& manufacturer,
                 const std::string& model,
                 int year) :
                    manufacturer(manufacturer),
                    model(model),
                    year(year) {
   ::lib::isInit("Vehicle");
}

main.cpp

#include "vehicle.h"

#include "lib.h"

int main(int argc, char** argv) {

   ::lib::isInit("main");

   ::lib::initialized = true;

   ::lib::isInit("main");

   Vehicle vehicle("Toyota", "Corolla", 2013);

   return 0;
}

Estou usando g ++

g++ -Wno-write-strings main.cpp vehicle.cpp -o bin/main.cpp.bin 

Eu recebo seguintes erros:

/tmp/cclVpsgT.o:(.bss+0x0): multiple definition of `lib::initialized'
/tmp/ccmJKImL.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

Eu verifiquei a saída de:

g++ -Wno-write-strings main.cpp vehicle.cpp -E

definição múltipla ocorre toda vez que lib.h é incluído.

Minhas perguntas são:

Por que a lib.h é incluída várias vezes quando define guarda está láComo eu definiria a variável 'extern' e inicializá-la no mesmo arquivo (desde que seja usada no mesmo arquivo mais tarde)

questionAnswers(1)

yourAnswerToTheQuestion