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

一个可能的问题是您的单元测试在头文件中。头文件在 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 回答