2

私は実際にLinuxアプリをMacOSXに移植しています。私の問題は、変数にはアクセスできますが、ポインターにはアクセスできないことです。

私はこのように変数を宣言しましたmain.h

uint64_t test;
uint64_t *test2;

mylib.h

extern uint64_t test;
extern uint64_t *test2;

そしてmylib.c私はこの方法で変数にアクセスします:

printf("%llu\n",test);
printf("%llu\n",*test2);

前者printf()は問題ありませんが、後者は私にこのエラーを与えます:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000008

なぜこれが起こったのか誰かが知っていますか?

私のggcコマンドラインには次のフラグがあります。

gcc -Wall -g -fPIC -c main.c gcc -shared -Wl,-undefined,dynamic_lookup -o mylib.so mylib.o
4

1 に答える 1

0

同様の問題を抱えている人のためだけに:

変数だけのダイナミックライブラリでメインプログラムの関数にアクセスするのに問題がなかったので、getter&setterを使用することにしました。

mylib.cで:

test2 = getTest();

main.cで:

uint64_t* getTest(){
    return &test;
}

アップデート

私はついにこのゲッターとセッターを回避する方法を見つけました。あなたが直面している問題は、変数を2回定義していることです。私の場合、これはexternキーワードの誤解の間に発生しました。main.h問題を解決するには、たとえば次のように変数をexternとして宣言する必要があります。

extern uint64_t test;
extern uint64_t *test2;

次のステップはあなたのmain.c例で変数を定義することです:

int main(...) {
    test = 1;
    test2 = &test;
}

そして最後にあなたのextern宣言を削除しますmylib.h

次のSO投稿が私の解決策につながりました:リンク

于 2012-12-14T11:54:16.630 に答える