0

私が含めているC++ヘッダーで定義された静的クラスPipeがあります。

私が(Objective-cから)呼び出すことに興味がある静的メソッドはここにあります:

static ERC  SendUserGet(const UserId &_idUser,const GUID &_idStyle,const ZoneId &_idZone,const char *_pszMsg);

userIDとzoneIDのコピーを格納しているように見えるObjective-cデータ構造にアクセスできます。次のようになります。

@interface DataBlock : NSObject
{
    GUID userID;
    GUID zoneID;
}

GUID defを検索しました。これは、同等性のためにオーバーロードされた演算子が多数含まれている構造体です。最初の関数シグネチャのUserIdとZoneIdは#typedefGUIDです

これで、メソッドを呼び出そうとすると、どのようにキャストしても(const UserId)、(UserId)など、次のリンカーエラーが発生します。

Ld build/Debug/Seeker.app/Contents/MacOS/Seeker normal i386
cd /Users/josh/Development/project/Mac/Seeker
setenv MACOSX_DEPLOYMENT_TARGET 10.5
/Developer/usr/bin/g++-4.2 -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk -L/Users/josh/Development/TS/Mac/Seeker/build/Debug -L/Users/josh/Development/TS/Mac/Seeker/../../../debug -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/gcc/i686-apple-darwin10/4.2.1 -F/Users/josh/Development/TS/Mac/Seeker/build/Debug -filelist /Users/josh/Development/TS/Mac/Seeker/build/Seeker.build/Debug/Seeker.build/Objects-normal/i386/Seeker.LinkFileList -mmacosx-version-min=10.5 -framework Cocoa -framework WebKit -lSAPI -lSPL -o /Users/josh/Development/TS/Mac/Seeker/build/Debug/Seeker.app/Contents/MacOS/Seeker

Undefined symbols:
  "SocPipe::SendUserGet(_GUID const&, _GUID const&, _GUID const&, char const*)", referenced from:
  -[PeoplePaneController clickGet:] in PeoplePaneController.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

これは型/関数の署名エラーですか、それとも本当にある種のリンカーエラーですか?私はこれらすべての型と静的クラスが定義されているヘッダーを持っています#imported-私はすでにつまずいているので、念のために#includeも試しました:P

許してください、私はWeb技術のバックグラウンドを持っているので、このcスタイルのメモリ管理と不変性は非常に曖昧です。

編集:完全なリンカーエラーテキストを追加しました。「関数」を「メソッド」に変更しました。また、カスタムmakefileを使用して、このプロジェクトの外部にあるいくつかのプロジェクトをコンパイルしていることにも注意してください。ただし、SocPipe静的メソッドはこのxcodeプロジェクトの他の場所で参照されており、正常にコンパイルされるようです。

4

2 に答える 2

1

(ええと、そのコメントを答えに変えましょう。)

メソッドのシグネチャは問題ないようです。つまり、呼び出している内容は、ヘッダーで宣言されている内容と一致します。そうでない場合は、リンカー エラーではなくコンパイル エラーが発生する可能性があります。

リンカーの問題は、この呼び出しを接続するための対応するオブジェクト コードがないことです。メソッドは宣言されていますが、定義されていません。

後者は、プロジェクトがコンパイルできる C++ ソース ファイル、またはリンクできるプリコンパイル済みライブラリまたはフレームワークのいずれかで発生する必要があります。いずれにせよ、そのファイルをプロジェクトに含めて、リンカーで使用できるようにする必要があります。

于 2010-05-15T23:35:44.550 に答える
1

を含むオブジェクト ファイルPipe::SendUserGetがビルドされていないか、Xcode ターゲットにリンクされていません。Pipe他の静的メソッドが正しく機能するかどうかは、それらのメソッドがヘッダー ファイルで定義されている場合、必ずしも関係ありません。

プロジェクトの一部をビルドするために外部のメイクファイルを使用するとおっしゃいました。その場合、コンパイル時に makefile を依存関係として実行するだけでは十分ではありません。結果の製品もプロジェクトに含める必要があります。

たとえば、ビルドするメイクファイルがある場合は、プロジェクトlibLIBRARY.aにドラッグlibLIBRARY.aしてターゲットに追加します。

これは、メイクファイルがライブラリを構築している場合にのみ機能します。makefile がプログラムをビルドする場合は機能しません。また、ライブラリが動的ライブラリである場合は、動的ライブラリがアプリケーションと共に配布されることを確認する必要があるため、さらに複雑になります (アプリ バンドルを作成している場合は、多くの場合、アプリ バンドルに配置することによって)。 . また、ユニバーサル バイナリをビルドする場合は、さらに複雑になります。理論的には、適切な CFLAGS を渡してユニバーサル ライブラリを構築することもできますが、アーキテクチャごとに 1 回make実行し、スクリプトを使用して結果を組み合わせる方が簡単な場合があります (これは私が行っていることです)。make

于 2010-05-15T23:43:11.703 に答える