0

Objective C++ を使用してフレームワークを作成していますが、単体テストのセットアップに問題があります。

フレームワーク ターゲットだけをコンパイルすると正常に動作します。

しかし、Xcode にテスト バンドルをコンパイルして実行するように指示すると、次のようになります。

Ld ~/Library/Developer/Xcode/DerivedData/TestFramework-axdefcbatoubjbbfqiyxildilobl/Build/Products/Debug/TestFrameworkTests.octest/Contents/MacOS/TestFrameworkTests normal x86_64
    cd "~/Projects/TestFramework"
    setenv MACOSX_DEPLOYMENT_TARGET 10.7
    "/Applications/Xcode 4.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++" -arch x86_64 -bundle -isysroot "/Applications/Xcode 4.5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk" -L~/Library/Developer/Xcode/DerivedData/TestFramework-axdefcbatoubjbbfqiyxildilobl/Build/Products/Debug -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -F~/Library/Developer/Xcode/DerivedData/TestFramework-axdefcbatoubjbbfqiyxildilobl/Build/Products/Debug "-F/Applications/Xcode 4.5.app/Contents/Developer/Library/Frameworks" -filelist ~/Library/Developer/Xcode/DerivedData/TestFramework-axdefcbatoubjbbfqiyxildilobl/Build/Intermediates/TestFramework.build/Debug/TestFrameworkTests.build/Objects-normal/x86_64/TestFrameworkTests.LinkFileList -mmacosx-version-min=10.7 -v -fobjc-arc -fobjc-link-runtime -fprofile-arcs -stdlib=libc++ -framework SenTestingKit -framework Cocoa -framework TestFramework -o ~/Library/Developer/Xcode/DerivedData/TestFramework-axdefcbatoubjbbfqiyxildilobl/Build/Products/Debug/TestFrameworkTests.octest/Contents/MacOS/TestFrameworkTests

Apple clang version 4.0 (tags/Apple/clang-421.10.48) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.0
Thread model: posix
 "/Applications/Xcode 4.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -bundle -macosx_version_min 10.7.0 -syslibroot "/Applications/Xcode 4.5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk" -o ~/Library/Developer/Xcode/DerivedData/TestFramework-axdefcbatoubjbbfqiyxildilobl/Build/Products/Debug/TestFrameworkTests.octest/Contents/MacOS/TestFrameworkTests -L~/Library/Developer/Xcode/DerivedData/TestFramework-axdefcbatoubjbbfqiyxildilobl/Build/Products/Debug -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -filelist ~/Library/Developer/Xcode/DerivedData/TestFramework-axdefcbatoubjbbfqiyxildilobl/Build/Intermediates/TestFramework.build/Debug/TestFrameworkTests.build/Objects-normal/x86_64/TestFrameworkTests.LinkFileList -framework SenTestingKit -framework Cocoa -framework TestFramework -force_load "/Applications/Xcode 4.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_macosx.a" -framework Foundation -lobjc -lc++ "/Applications/Xcode 4.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/4.0/lib/darwin/libclang_rt.profile_osx.a" -lSystem "/Applications/Xcode 4.5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/4.0/lib/darwin/libclang_rt.osx.a" -F~/Library/Developer/Xcode/DerivedData/TestFramework-axdefcbatoubjbbfqiyxildilobl/Build/Products/Debug "-F/Applications/Xcode 4.5.app/Contents/Developer/Library/Frameworks"
Undefined symbols for architecture x86_64:
  "Foo::Bar::Bar()", referenced from:
      -[FooBar_Tests testBaz] in FooBar_Tests.o
  "Foo::Bar::baz() const", referenced from:
      -[FooBar_Tests testBaz] in FooBar_Tests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

私は持っている:

C++ Language Dialect: c++11
C++ Standard Library: libc++

両方のビルド ターゲット (フレームワークとテスト バンドル)に設定します。
もちろん、テスト バンドル ターゲットのフレームワークにリンクしています。
さらに、すべてのフレームワーク ヘッダーはパブリックとしてマークされます。
また、フレームワーク ファイルをテスト バンドルのターゲットに追加して、除外してみました。これらのどれも問題を解決しませんでした。

今ここで何がうまくいかないのか、私は少し困惑しています。何か案は?


これは、私のC++クラスがどのように見えるかです(ちょっと):

//FooBar.hh
namespace Foo {
    class Bar {
    public:
        bool baz() const;
    }
}

//FooBar.mm
#import "FooBar.hh"
namespace Foo {
    bool Bar::baz() const {
        return true;
    }
}

そして、これは私のテストケースです:

//FooBar_Tests.hh
#import <SenTestingKit/SenTestingKit.h>

@interface FooBar_Tests : SenTestCase

@end

//FooBar_Tests.mm
#import "FooBar_Tests.hh"
#import <TestFramework/FooBar.hh>
//this one fails as well (compiles fine, fails one linkage):
//#import "FooBar.hh"

@implementation FooBar_Tests

- (void)testBaz {
    Foo::Bar bar();
    STAssertEquals(bar.baz(), true, nil);
}

編集.hh: コードを&.mmファイルに分割します。それでも同じエラーが発生します。

4

2 に答える 2

1

考えられる問題の1つは、単体テストがヘッダーファイルにあることです。ヘッダーファイルは、OCUnitではあまり機能しません。ヘッダーファイルを削除して、すべてのテストケースコードを実装ファイルに入れることもできます。プロジェクトにObjective-C単体テストクラスを追加し、拡張子に.mmを付けて、そこにテストケースコードを移動します。それで問題は解決しますか?

OCUnitを使用してC++コードを単体テストすると、リンクエラーを回避するために、アプリ内のC++ファイルを単体テストターゲットに追加する必要があります。それがObjective-C++コードに適用されるかどうかはわかりませんが、調査する必要があります。

于 2012-07-23T18:56:48.633 に答える
0

最終的に、新しいユニット テスト ターゲットをプロジェクトに追加し、C++11 を有効にして、コンパイル/実行を試みました。成功。
どういうわけか、私の元のユニット テスト ターゲットは、C++11 に関してはうまくいかなかったに違いありません。以前は問題なくコンパイルされていました。

今度は、テスト ケースを新しいテスト バンドルに移行するときだと思います。

…そして、気が狂うかと思いました。まあ…</p>

于 2012-07-23T20:46:01.210 に答える