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,这样你就不会发生名称冲突。
我有一些 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,这样你就不会发生名称冲突。