【发布时间】:2019-12-22 08:44:40
【问题描述】:
我在使用英特尔编译器的 Windows 编译中有一个头文件。标题看起来像这样:
#ifdef _MAIN
Loggerp logger;
#else
extern Loggerp logger;
#endif
_MAIN 宏在 C++ 文件中定义,并且有一个包含标头的 C 文件。这会生成“...LNK2019: unresolved external symbol...”,因为 C++ 编译会修饰(破坏)“记录器”名称,使得链接器无法将未修饰的 C 名称与修饰的 C++ 名称匹配。
MSVC 文档声明 MS 编译器将同时支持“extern "C"' 和 'extern "C++"'。但是,英特尔编译器会将“extern”的引号标记为错误。
有人知道如何让英特尔编译器标记此引用,以便它可以链接到 C++ 和 C 吗?
【问题讨论】:
-
这并没有解决问题,但是以下划线开头的名称后跟大写字母 (
_MAIN) 和包含两个连续下划线的名称保留供实现使用。不要在你的代码中使用它们。 -
谢谢,这是我的错,#define 不同,我只是删除了它的第一部分,最后留下了 _ 前缀。观察力还是不错的。
-
您可能可以抽象出制造商。你是用 ICC 构建 C 部分,用 MSVS 构建 C++ 部分吗? (请注意,两者都可以)澄清额外的支持!
-
@LightnessRacesinOrbit 这两个部分都是使用 ICC 构建的。大多数对 logger 的引用来自 C++ 文件,只有一个来自 C 文件。我提到 MSVC 是因为我认为 MSVC 'extern "C++"' 可能是一个好方法,但似乎 ICC 不支持它。
-
听起来你认为
extern "C++"是一个 MSVC 的东西。它不是。它是 C++ 的一部分。如果您不使用它,您可能希望从您的问题中删除对 Visual Studio 的引用。 FWIW 我在其他地方没有看到 ICC 在这方面不合规的证据。 minimal reproducible example 将是一个好的开始。