3

私はopenGLエンジンを作成しています(一方はES 1.1用、もう一方はES 2.0用)。両方のエンジンには現在、いくつかの一定の Vertex があります (以下に示すように)。残念ながら、コンパイル時に次のエラーが表示されます。

 ld: 1 duplicate symbol for architecture i386
 clang: error: linker command failed with exit code 1 (use -v to see invocation) with the duplicate symbol being _Verticies. 

Xcode が 2 つの別々のファイルで定数値が重複していると文句を言うのはなぜですか? 同じプロトコルに準拠するファイル...しかし、ほとんどの場合、それはそれらの接続です。C++ では、このメソッドは正常に機能しますが、Objective-C に変換すると、前述のエラーが発生します。

//Define the positions and colors of two triangles
const Vertex Verticies[] = { //per vertex data
    {{-0.5f, -0.866f},{1.0f, 1.0f, 0.5f, 1.0f}},
    {{0.5f, -0.866f},{1.0f, 1.0f, 0.5f, 1.0f}},
    {{0.0f, 1.0f},{1.0f, 1.0f, 0.5f, 1.0f}},
    {{-0.5f, -0.866f},{0.5f, 0.5f, 0.5f, 0.0f}},
    {{0.5f, -0.866f},{0.5f, 0.5f, 0.5f}},
    {{0.0f, -0.4f},{0.5f, 0.5f, 0.5f}},
};

解決策: 現在、Objective-C のデフォルトの const 値は、ファイルのスコープではなく、プロジェクトのスコープの対象になっているようです。C++ では、const 値を作成するときに、スコープが自動的にそのファイルに制限されます。Objective-C でこの問題を修正するには、静的タグを使用してスコープを特定のファイルに制限する必要があります。extern タグを使用することもできます (ただし、少し手間がかかります)。

4

2 に答える 2

5

constC++ ではグローバル変数 withも暗黙的に であるため、C++ で機能しますstatic。これは C には当てはまりません。C から「継承」する Objective-C に変更すると、この動作は失われ、const記号が突然 になりexternます。

C++ で使用していたのと同じ動作を得るには、const変数に接頭辞を付けます。static

于 2013-03-06T20:11:31.730 に答える
3

Verticies変数が 1 つのコンパイル単位 (ファイル) でのみ使用される場合は、ストレージ クラス指定子を使用して宣言する必要がありますstatic

これにより、コンパイラがリンカから見える外部シンボルを発行するのを防ぎます。C 言語: シンボルには内部リンケージがあります。

C と C++ の多くの微妙な違いの 1 つは、C ではconst内部リンケージを意味しないことです。

于 2013-03-06T20:00:47.030 に答える