2017-03-03 17 views
0

と宣言してグローバルスコープの競合における変数の宣言は、私はXCodeのとC++ 11サポートのコンパイラを使用してInDesignの新しいバージョン用にコンパイルしようとしていますInDesignのプラグインのいくつかのレガシーコードを持っています。C++:C言語リンケージ

以下のようにC結合を持つクラスオブジェクトを含むヘッダファイルAdWrksSession.hがあります。 externオブジェクト/変数の宣言が進むにつれ:古いコンパイラを

CAdWrksSession gAdWrksSession; 

extern "C" CAdWrksSession gAdWrksSession; 

をし、CPPファイルAdWrksSession.cppexternオブジェクトと同じ名前のデフォルトのコンストラクタを持つグローバルクラスオブジェクトが含まれていますこのため、すべてのエラーメッセージを示したが、それは私に次のエラーを示してC++ 11のサポートとXCodeの7.2.1のためにアップルが提供する新しいコンパイラでそれを使用するときにされませんでした。

:私は headerファイル内でextern変数の宣言については、以下の構文を試してみました

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

:私は次のように既にC連携のための質問をしようとしている3210 Declaration of 'gAdWrksSession' in global scope conflicts with declaration with C language linkage

#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 

が、何もこれまで働いていません。当然の

私はstatic

static CAdWrksSession gAdWrksSession; //Header File 

としてheaderファイル宣言を行うと、その後のコードは正常にビルドが、機能が動作しません。

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言語で 'class'を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"の使用は無視されると思います。 extern "C"の動作については、thisスタックオーバーフローに関する質問があります。

あなたのヘッダがあることを確認するための唯一の方法は、Cがダミーmain.cの中にヘッダを含めるとそれにライブラリをリンクしようとすることです本当にあります。しかし、多分私達はあなたの問題を解決するために別のアプローチを見つけることができます

(あなたがこの上でより多くの明確化が必要な場合は、私に教えてください)。私はあなたがこのプラグインの制限を知らない。私は、あなたが個人的に(そして可能であれば静的にも)レガシーコードとリンクする共有オブジェクトであるプロキシライブラリを作ることを提案します。これは、公開する必要があるすべてのクラスにプロキシデザインパターンsee API section book 3.4.1を適用することです。

次に、このプロキシライブラリと新しいコードのリンクを作成できます。この方法で名前の衝突は発生しません。

+0

'CAdWrksSession'は実際にはクラスですが、' extern "C" 'は無視されませんでした。それを削除すると多くのエラーが発生し、通常のオブジェクトにすることなく、外部リンケージには何百もの重複警告が表示されていました。 私はついに「静的」にしました。 – d0mbn00b