2017-03-03 90 views
0

我有一些InDesign插件的遗留代码,我正在尝试为使用C++ 11支持的XCode编译器的InDesign新版本进行编译。C++:全局范围变量的声明与声明与C语言链接冲突

有一个头文件AdWrksSession.h,其中包含一个具有C链接的类对象,如下所示。 作为extern对象/变量的声明所说:

extern "C" CAdWrksSession gAdWrksSession; 

和cpp文件AdWrksSession.cpp包含具有相同名称的默认构造为extern对象全局类对象:

CAdWrksSession gAdWrksSession; 

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

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

我曾尝试已经在关注问的问题,为C联动:

Compiler error for conflicting variable declarations: "conflicts with new declaration with 'C' linkage"

What is "extern linkage and with C language linkage"

Mixing declarations with extern, static and no storage specifier in global scope

我尝试了外部变量声明如下语法在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 

那么代码成功生成,但功能不工作,当然。

UPDATE: 如果我删除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)` 

谁能帮助我在这里?谢谢。

+2

你如何在c中使用C++类?只是好奇。 –

+0

我不认为你可以在C中使用C++类。你可以通过一个接口在C中使用C++模块。 http://stackoverflow.com/questions/11971063/how-to-use-c-objects-in-c – d0mbn00b

+0

那么如何可以'extern“C”CAdWrksSession gAdWrksSession;'使用类类型? –

回答

0

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

要确保您的标头真的是C,唯一的方法是将标头包含在一个虚拟的main.c文件中,并尝试将该库链接到它。 (让我知道如果你想在这方面进一步澄清)

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

然后,您可以使用此代理库创建新的代码链接,这样您就不会遇到名称冲突。

+0

'CAdWrksSession'确实是一个类,但'extern“C”'没有被忽略。删除它给了很多错误,并使其成为普通对象,而没有和外部链接显示数百个“重复”警告。 我终于把它变成了'静态',现在它工作得很好。 – d0mbn00b