C++:全局范围内的变量声明与使用 C 语言链接的声明冲突

C++: Declaration of variable in global scope conflicts with declaration with C language linkage

我有一些 InDesign 插件的遗留代码,我正在尝试为使用 C++11 支持的编译器和 XCode.

的新版 InDesign 编译

有一个头文件 AdWrksSession.h,其中包含一个带有 C 链接的 class 对象,如下所示。 作为 extern object/variable 的声明:

extern "C" CAdWrksSession gAdWrksSession;

并且 cpp 文件 AdWrksSession.cpp 包含一个全局 class 对象,其默认构造函数与 extern 对象同名:

CAdWrksSession gAdWrksSession;

较旧的编译器没有为此显示任何错误消息,但是当它与 Apple 为 XCode 7.2.1 提供的支持 C++11 的新编译器一起使用时,它显示了以下错误:

Declaration of 'gAdWrksSession' in global scope conflicts with declaration with C language linkage

我已经尝试按照已经提出的有关 C 链接的问题:

What is "extern linkage and with C language linkage"

我在 header 文件中尝试了以下用于外部变量声明的语法:

#ifdef __cplusplus
   extern "C" {
#endif
        CAdWrksSession gAdWrksSession;
#ifdef __cplusplus
    }
#endif

#ifdef COMPILE_FOR_C_LINKAGE
     extern "C" CAdWrksSession gAdWrksSession; 
#else
     extern "C++" CAdWrksSession gAdWrksSession;
#endif

但到目前为止没有任何效果。

当我将 header 文件声明为 static

static CAdWrksSession gAdWrksSession; //Header File

然后代码构建成功,但该功能当然不起作用。

更新: 如果我删除 C 链接,则会收到如下链接器错误:

Undefined symbols for architecture x86_64:
  "smart::gAdWrksSession", referenced from:
....//Names of generated object files
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 
(use -v to see invocation)`

有人可以帮我吗?谢谢。

我认为如果 CAdWrksSession 确实是一个 class 而不是不透明指针,那么您在 header 中使用的 extern "C" 将被忽略。 this 堆栈溢出问题中有一些关于 extern "C" 行为的讨论。

确保 header 确实是 C 的唯一方法是将 header 包含在虚拟 main.c 中并尝试 link 库它。 (如果您想对此进行更多说明,请告诉我)

不过,也许我们可以找到另一种方法来解决您的问题。我不知道你对这个插件有什么限制。我建议您制作一个共享 object 的代理库,其中 link 与遗留代码私下(如果可能的话也是静态的)。也就是说,将代理设计模式 see API section book 3.4.1 应用于您需要公开的所有 classes。

然后你可以用这个代理库制作新代码link,这样你就不会发生名称冲突。