4

私は Android NDKr8 を使用し、拡張子 gcc を使用して、組み込みプラットフォームを含む複数のプラットフォームで共有されるライブラリ コードをコンパイルしています。このコードは、セグメントを使用して一連の要素を連続したメモリ空間に配置します。コンパイルで「エラー: variable_name がセクション タイプの競合を引き起こします」が生成されます。

マクロを使用してセグメント属性を宣言します。

# define DB_SEGMENT __attribute__ ((__section__ ("DBSegment")))

上記の variable_name は次のように宣言されます。

dbStruct const variable_name[] DB_SEGMENT = {
    {conststringvalue0, sizeof(conststringvalue0)},
    …more like this
};

dbStruct は

typedef struct dbStruct
{
    const char * const  address;
    const UINT16        stringSize;
} dbStruct;

conststringvalue0 は次のように宣言されます。

const char conststringvalue0[] DB_SEGMENT = "some string value";

この同じコードは、デフォルトのコンパイラを使用して Xcode でコンパイルされ、DB_SEGMENT マクロの宣言にわずかな変更を加えるだけです。これは私が慣れ親しんでいるよりも深い C です。Google にはエラーへの参照がいくつかありますが、その修正は明確ではありません。特定の連続したメモリ セクションを設定するためのより良い戦略はありますか?

コメントに応じて、XCode で正しくコンパイルされたバージョンとの唯一の違いは次のとおりです。

#define DB_SEGMENT __attribute__ ((section ("DBSegment,DBSection")))
4

2 に答える 2

0

"# DB_SEGMENT属性を定義します((セクション("DBSegment")))"

# と define の間にスペースがありますが、これは正しくありません。

そのスペースを削除して、コンパイルしてみてください。

于 2019-04-29T13:42:58.290 に答える