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

Use global variable declared in header by more C++ files

本文关键字:文件 声明 全局变量 c++      更新时间:2023-10-16

我正在尝试从共享相同.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"的成员,而且我也可以使用预处理器命令。

谢谢你的帮助

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;
    }
}

如果你想知道为什么你的include保护符(如果你正在使用它们)没有阻止在不同的翻译单位中对同一符号的多个定义,请参阅

  bool* init(){
      static bool commonvar = false;
      return &commonvar;     
  }