我有这些由 3 个文件组成的虚拟软件:
测试.h
int gv;
void set(int v);
测试.c
#include "test.h"
void set(int x) {
gv = x;
}
主程序
#include "test.h"
#include <assert.h>
int main() {
set(1);
assert(gv == 1);
}
代码在 MSVC 2019 和 GCC 8 中都可以编译并运行良好,但由于 clang(Visual Studio 2019 提供的 clang-cl 11)在链接时失败并抱怨gv
已定义:
1>------ Build started: Project: test, Configuration: Debug x64 ------
1>lld-link : error : undefined symbol: gv
1>>>> referenced by ...\test\main.c:6
1>>>> x64\Debug\main.obj:(main)
1>>>> referenced by ...\test\test.c:4
1>>>> x64\Debug\test.obj:(set)
1>Done building project "test.vcxproj" -- FAILED.
我知道这extern
是在文件范围内定义的对象的默认存储类说明符,但如果我明确指定extern
to int gv
,它会破坏与每个编译器的链接(gv
当然,除非我在源文件中添加定义)。
有一点我不明白。怎么了?