2017-03-03 101 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