1

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

谢谢你的帮助

4

2 回答 2

2

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

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

我的库

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

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

namespace mylib {
    namespace part1 {
        bool commonvar;
    }
}

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

于 2013-02-27T14:48:24.970 回答
0

下面怎么样

  bool* init(){
      static bool commonvar = false;
      return &commonvar;     
  }
于 2013-02-27T14:48:11.560 回答