使用更多C ++文件在标头中声明的全局变量

时间:2013-02-27 14:43:29

标签: c++ variables dll export global

我正在尝试从共享相同.h的各种.cpp文件创建动态库。它是这样的:

// mylib1.cpp
namespace mylib {
    namespace part1 {
        void init() {
            part1::commonvar = true;
        }
    }
}

// mylib2.cpp
namespace mylib {
    namespace part2 {
        void check() {
            if (part1::commonvar == true) {
                // do something
            }
        }
    }
}

这是常见的标题

// mylib.h
#ifdef __cplusplus 
extern "C" {
#endif
    namespace mylib {
        namespace part1 {
            bool commonvar = false;
            void init();
        }
        namespace part2 {
            void check();
        }
    }
#ifdef __cplusplus 
}
#endif

我正在使用GCC(MingW)编译并将其链接到单个DLL中,如下所示:

g++ -Wall -s -O2 -c mylib1.cpp -o mylib1.o
g++ -Wall -s -O2 -c mylib2.cpp -o mylib2.o
g++ -Wall -s -O2 -shared -o MyLib.dll -Wl,--out-implib=lib/libMyLib.dll.a mylib1.o mylib2.o

所以,我的问题是当我做这一切时,我在尝试链接这两个对象时会得到该变量的多个定义错误。因此,我想知道是否有一种解决方法可以使 commonvar 在两个命名空间中都很常见,但在两个目标文件中都不会重复。如果需要,我可以使它成为命名空间“ mylib ”的成员,我也可以使用预处理器命令。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

const个全局变量具有外部链接。您正在将commonvar全局变量的相同定义导入到多个翻译单元中,并且链接器最终会抱怨您多次定义该符号,违反了一个定义规则。

您应该使用extern关键字将全局变量的定义转换为declaration,并在一个 .cpp文件中定义全局变量:

<强> MyLib.h

namespace mylib {
    namespace part1 {
        extern bool commonvar;
    //  ^^^^^^
        void init();
    }
    namespace part2 {
        void check();
    }
}

MyLib.cpp (或任何其他.cpp文件,只要只有一个

namespace mylib {
    namespace part1 {
        bool commonvar;
    }
}

如果您想知道为什么您的包含警卫(如果您使用它们)并未阻止不同翻译单元中同一符号的多个定义,see this

答案 1 :(得分:0)

以下

怎么样?
  bool* init(){
      static bool commonvar = false;
      return &commonvar;     
  }