Solution(VS)下多工程之间共享全局变量失效问题
标签(空格分隔):c/c++ vs
http://blog.youkuaiyun.com/hust_sheng/article/details/52829425
Solution
- 解决方案的意思,可以看做是多个关联项目的链接器。
- 解决方案把多个相关联的项目通过sln文件关联起来,记录项目地址方便开发者。
- 一个解决方案可以有多个项目(project),项目可以单独生成,此时解决方案并不会更新,需要你重新生成来挂上新的项目的链接。
问题描述
Solution(解决方案)
- utest (主工程,包含main函数)
- ucodec (dll库)
- core (lib库)
utest.c中的main函数首先调用core.lib中的函数进行相关初始化操作,该过程中会创建若干全局变量,比如g_context等。
- utest.c中的main函数接下来调用ucodec.dll中的函数func_op()进行具体操作,函数func_op()在执行的过程中会调用core.lib中的函数,而core.lib中的这些函数会使用之前创建的全局变量(g_context等),此时会发现,这些全局变量都失效了,值为NULL。
问题产生的原因
问题的关键还在于动态库和静态库的链接以及执行的过程。utest和ucodec.dll都会调用core.lib,对静态链接来说,链接过程都是将静态库的代码直接加入相应的代码工程中,之后再进行编译操作。也就是说,utest和ucodec各自都有一份静态库代码,也就各有一份全局变量(且互不干扰),所以说,上述过程中,不是全局变量失效了,而是这些全局变量只是执行了默认初始化,而没有进行赋值操作。
- 如果上述过程中的全局变量是在动态库中创建的呢?
根据动态库的链接过程,应该是可以的,因为并不会产生各自的全局变量,动态库中的全局变量都有对应的字符表以及相应的地址(访问同一个地址)。