我创建了这个最小的例子来说明我使用Visual Studio 2008进行extern声明的问题(编译python 2.7扩展需要)。同样的例子适用于gcc。 结果是我在lib.c中有2个单独的global_var变量而不是唯一的变量
库接口:lib.h
#ifndef LIB_H
#define LIB_H 1
int __declspec( dllexport ) displayGlob();
#endif // LIB_H
图书馆代码
// lib.c
#include<stdio.h>
int global_var=2;
int __declspec( dllexport ) displayGlob() {
printf("lib.c global_var=%d\n", global_var);
return global_var;
}
使用库变量“global_var”和函数displayGlob()
的用户代码// main.c
#include"lib.h"
#include<stdio.h>
#include<stdlib.h>
extern int global_var=0; // must be initialized otherwise "error LNK2001: unresolved external symbol global_var"
int main(int argc, char *argv[])
{
printf("main.c global_var=%d\n", global_var);
displayGlob();
global_var = 3;
printf("main.c global_var=%d\n", global_var);
displayGlob();
exit(0);
}
执行结果是:
main.c global_var=0
lib.c global_var=2
main.c global_var=3
lib.c global_var=2
问题:
1 - 为什么我必须用Visual Studio而不是Gcc初始化lib.h中的extern变量?
2 - 为什么第二个displayGlob()显示的global_var lib.c没有被修改为3?
感谢任何提示!
劳伦
UPDATE:将global_var的extern声明从lib.h移到main.c(更简单的例子) 当然问题仍然存在......
答案 0 :(得分:0)
因为C预处理程序在您调用#include
时基本上粘贴了内容,所以它与您在extern
文件中声明main.c
的内容相同。这意味着此符号定义了两次(main.c
和lib.c
)。
您应该做的是向extern
添加lib.c
声明(例如,通过包含lib.h
)并在其中初始化值,然后从lib.h
中删除初始化。< / p>
所以它应该是这样的:
lib.h:
extern global_var;
lib.c:
#include "lib.h"
int global_var=2;
的main.c
#include "lib.h"
(no global_var definition/declaration here)
答案 1 :(得分:0)
解决了我自己,我的错。
在Gcc下,我构建了一个静态库和一个动态库。我的main.c与STATIC库链接,因此在链接时解析了lib.c和main.c之间的可变分辨率。我忘记了。
在Visual Studio下,我只构建了一个DYNAMIC库,因此在DLL和main之间不会发生正常的变量链接。
很抱歉任何混乱......