Android NativeでAndroid.mkリンクのコンパイル時に名前が競合する問題
今日、Linux CプログラムをAndroidソースレイヤに移植したときに問題が発生しました.このような問題に遭遇した他の友人が調べたことを記録します.
問題のヒントは明らかで、リンクの時に2つあることを発見した.oファイルには「mp_mul_2」という関数名が生成され、名前の競合が発生します.
しかし、私はすべてのコードとライブラリを調べて、1つの宣言mp_しか見つかりませんでした.mul_2 aの場所、すなわちbnn_mp_mul_2.cでは、同じ内容のmakefileがLinuxでコンパイルされたときにこのエラーは報告されませんでした.
その後、接続エラーをよく見てみると、bnn_だったはずです.mp_mul_2.cのmp_mul_2関数とbnn_mp_mul_2.cのmp_mul_2衝突した!
不思議でしょう、同じファイルの中の同じ関数が衝突しました!!!
元makefileに2回書いてあったbn_mp_mul_2.c、すなわち:
/home/***/android4.2/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: error: out/target/product/***/bn_mp_mul_2.o: multiple definition of 'mp_mul_2'
/home/***/android4.2/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: out/target/product/***/bnn_mp_mul_2.o: previous definition here
問題のヒントは明らかで、リンクの時に2つあることを発見した.oファイルには「mp_mul_2」という関数名が生成され、名前の競合が発生します.
しかし、私はすべてのコードとライブラリを調べて、1つの宣言mp_しか見つかりませんでした.mul_2 aの場所、すなわちbnn_mp_mul_2.cでは、同じ内容のmakefileがLinuxでコンパイルされたときにこのエラーは報告されませんでした.
その後、接続エラーをよく見てみると、bnn_だったはずです.mp_mul_2.cのmp_mul_2関数とbnn_mp_mul_2.cのmp_mul_2衝突した!
不思議でしょう、同じファイルの中の同じ関数が衝突しました!!!
元makefileに2回書いてあったbn_mp_mul_2.c、すなわち:
...
CoreUtils_SRCS += bn_mp_mul_2.c
CoreUtils_SRCS += bn_mp_mul_2.c
...
はAndroidに対応する.mkでは...
$(SUPPORT_DIR)/bn_mp_mul_2.c \
$(SUPPORT_DIR)/bn_mp_mul_2.c \
...
この方式はGNU Cコンパイラを使う時問題なくて、bionic Cコンパイラを使う時間違いを報告して、1行削除すればいいです!