gpt4 book ai didi

c++ - 共享库项目 (C++) 中的全局变量问题

转载 作者:太空狗 更新时间:2023-10-29 20:49:11 24 4
gpt4 key购买 nike

我对 C++ 共享库项目中的全局变量有疑问。我的库必须作为标准的 g++ 共享库 (.so) 和 dll。我通过创建文件 libiup_dll.cpp 和 libiup_dll.h 来做到这一点,其中我有类似的东西

#ifdef BUILD_DLL

// code for the dll: wrapper functions around the classes in my shared library

#endif

在我的 dll 中,我需要函数 setloglevel(int) 和 geterrormsg()。在我所有的类(class)中,我都会将所有错误消息附加到全局变量 errormsg 中。这个变量然后应该由 geterrormsg() 函数返回。我通过使用实现了这一点

std::string errormsg;
int loglevel;

在libiup_dll.h(外面和#ifdefs,所以它应该是全局可用的),然后把

extern std::string errormsg;
extern int loglevel;

在我类(class)的 .h 文件中(在类(class)之外,在文件的顶部)

现在我有两个问题:

1) 当用 g++ 编译一个命令行程序时,它使用了我的库,我得到了错误

Building target: libiup_test Invoking: GCC C++ Linker g++ -L"/home/hilboll/src/libiup/Release" -L/usr/local/lib -o"libiup_test" ./src/stratcalc/SimpleStratosphericColumnCalculatorTest.o ./src/interp/SimpleInterpolatorTest.o ./src/Test.o -lgsl -lhdf5 -lhdf5_cpp -lblas -liup /home/hilboll/src/libiup/Release/libiup.so: undefined reference to loglevel'
/home/hilboll/src/libiup/Release/libiup.so:
undefined reference to
errormsg' collect2: ld returned 1 exit status make: *** [libiup_test] Error 1

即使在我的命令行程序中,也没有任何对 errormsg 或 loglevel 的引用。

2) 当试图在 windows 下用 VS2008 编译 dll 时,我得到

z:\src\vs\libiup_dll\libiup_dll.h(229) : error C2086: 'std::string errormsg': Neudefinition z:\src\libiup\src\stratcalc../interp/SimpleInterpolator.h(16): Siehe Deklaration von 'errormsg' z:\src\vs\libiup_dll\libiup_dll.h(234) : error C2086: 'int loglevel': Neudefinition z:\src\libiup\src\stratcalc../interp/SimpleInterpolator.h(17): Siehe Deklaration von 'loglevel'

据我了解,这意味着 VS 认为我将这两个变量定义了两次。然而,在 SimpleInterpolator.h 16/17 中,只有外部声明 ...

看来我还不明白全局变量是如何工作的。非常感谢任何帮助!

最佳答案

诀窍是知道每个 .cpp 文件都是一个编译单元 - 即被编译的东西。每个人都是一个完整的个体,彼此之间一无所知。只有在链接阶段,这些才被汇集在一起​​。

现在,extern 对编译后的 cpp 文件说“这个变量可以在别处找到”,编译器只是向链接器放置一个引用提示来解决问题。

因此,当您将变量定义放在头文件中时,您很可能将该头文件包含到 2 个(或更多)cpp 文件中。因此,这些 cpp 文件中的每一个在编译时都认为它们具有真正的变量。然后链接器出现并看到太多。

将变量放入它们自己的 cpp 文件中(或放入主 cpp 文件中),并且只将外部引用放在头文件中。那么您应该可以使用多重定义的符号。

关于c++ - 共享库项目 (C++) 中的全局变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1323042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com