Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用更多C+;在标头中声明的全局变量+;文件夹_C++_Variables_Dll_Export_Global - Fatal编程技术网

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

C++ 使用更多C+;在标头中声明的全局变量+;文件夹,c++,variables,dll,export,global,C++,Variables,Dll,Export,Global,我正在尝试从共享相同.h的各种.cpp文件创建一个动态库。是这样的: // mylib1.cpp namespace mylib { namespace part1 { void init() { part1::commonvar = true; } } } g++ -Wall -s -O2 -c mylib1.cpp -o mylib1.o g++ -Wall -s -O2 -c mylib2.cpp -o mylib2

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

// mylib1.cpp
namespace mylib {
    namespace part1 {
        void init() {
            part1::commonvar = true;
        }
    }
}
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

这是公共标题

// 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中,如下所示:

// mylib1.cpp
namespace mylib {
    namespace part1 {
        void init() {
            part1::commonvar = true;
        }
    }
}
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”的成员,也可以使用预处理器命令


感谢您的帮助

以下内容如何

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

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

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

MyLib.h

namespace mylib {
    namespace part1 {
        extern bool commonvar;
    //  ^^^^^^
        void init();
    }
    namespace part2 {
        void check();
    }
}
MyLib.cpp(或任何其他
.cpp
文件,只要它只有一个)


如果您想知道为什么include-guard(如果您正在使用它们)不阻止在不同的翻译单元中对同一符号进行多个定义,

…作为最后一个解决方案,我将创建一个函数来返回该值,因为编译器单独编译每个源文件时,将在多个目标文件中具有相同的符号,最后链接将生成链接器错误。可以使用extern关键字来避免这种情况。我会试试这个。我知道引擎盖下发生了什么,我只是不知道如何让它被理解为一个外部/导出元素。就像魅力一样。可以在cpp或标题中初始化该变量?Thanks@ali:在
.cpp
中。标题中的内容只是一个声明。