1

Core Foundation関数をリバースエンジニアリングして、コードで使用しようとしています。この関数に必要な引数の数は1つだけであると判断しました。この関数は、単一を取り、CFStringRefを返すことを意図していると99%確信していますCFStringRef。だから私はそのように関数を宣言しました:

extern CFStringRef CPPhoneNumberCopyFormattedStringForTextMessage(CFStringRef pnString);

そして、私はそれを使用しようと試みました:

CFStringRef formattedAddress = CPPhoneNumberCopyFormattedStringForTextMessage((CFStringRef)@"test");

しかし、コンパイルすると、おなじみのsymbol not foundエラーが発生します。

Undefined symbols for architecture armv7:
"CPPhoneNumberCopyFormattedStringForTextMessage(__CFString const*)", referenced from: ...
ld: symbol(s) not found for architecture armv7

さて、通常、関数のシグネチャ(引数の数、引数の型など)に関する推測の少なくとも1つが間違っていると思いますが、この場合、アセンブリを何度も繰り返しましたが、意味のある唯一の署名は、私が提供したものです。私は正しいフレームワークにリンクしていることを知ってnmおり、関数のシンボルが実際にそこにあることを確認するために実行しました。

だから私の質問は2つの部分に分かれていると思います:

  1. ここに欠けているものはありますか?
  2. このようなC関数がコンパイラを満足させるために必要な引数の数や引数の型を決定するためのより良い方法はありますか?

私はコンパイラ/リンカがどのように機能するかについての専門家ではありませんが、その関数に正しくリンクするために正確な関数宣言に依存している場合、それを利用できる何かをしているに違いないと思います。正確には何をチェックしていますか?各sizeof引数の?そして、これを利用して、知識に基づいた推測よりも簡単に関数の引数を決定できる方法はありますか?

役立つ場合は、アセンブリコードやその他の情報を提供できます。

編集:明確にするために、私はiOS 5.1で実行しているので、これはARM(正確にはarmv7)用にコンパイルされています。最新バージョンのClangを使用してコンパイルしています。フレームワークは、armv6とarmv7の両方のファットバイナリです。

4

1 に答える 1

2

C++コンパイラを使用してコードをコンパイルしているように見えます。CPPhoneNumberCopyFormattedStringForTextMessageのプロトタイプをブロックに入れるextern "C"と、名前のマングリングが行われないため、リンクする必要があります。タイプを決定することは完全に別の問題です。

于 2012-09-06T18:24:15.473 に答える