代码之家  ›  专栏  ›  技术社区  ›  ewizard

用于arm64架构的ios objective-c复制符号

  •  0
  • ewizard  · 技术社区  · 4 年前

    用这只手把我的手举到空中。我尝试过协议、正向声明类、正向声明协议,但我无法找出有效的配置。我将列出有问题的头文件,以便您可以看到正在导入的内容,但我确信问题在于循环加载导入。

    错误是:

    Ld /用户/eamonwhite/库/开发人员/Xcode/派生数据/maggie govvbppylostlwashtkbcuawqzc/构建/产品/调试iphoneos/maggie.app/maggie 普通arm64(在“maggie”项目的目标“maggie”中) cd/用户/eamonwhite/maggie/maggie /应用程序/Xcode.app/内容/XcodeDefault.xctoolchain/usr/bin/clang -目标arm64-apple-ios13.4-isysroot/应用程序/Xcode.app/内容/开发人员/平台/iPhoneOS.platform/开发人员/SDKs/iPhoneOS13.4.sdk -L/用户/eamonwhite/库/开发人员/Xcode/衍生数据/maggie govvbppylostlwaashtkbcuawqzc/构建/产品/调试iphoneos -F/用户/eamonwhite/库/开发人员/Xcode/衍生数据/maggie govvbppylostlwaashtkbcuawqzc/构建/产品/调试iphoneos -filelist/Users/eamonwhite/Library/Developer/Xcode/DerivedData/maggie govvbppylostlwaashtkbcuawqzc/构建/中介.noindex/maggie.Build/Debug-iphoneos/maggie.Build/Objects-normal/arm64/maggie。链接文件列表 -Xlinker-rpath-Xlinker@executive_path/Frameworks-dead_strip-Xlinker-object_path_lto-Xlinker/用户/eamonwhite/库/开发人员/Xcode/衍生数据/maggie govvbppylostlwaashtkbcuawqzc/构建/中介.noindex/maggie.Build/Debug-iphoneos/maggie.Build/对象-normal/arm64/maggie_lto。o -Xlinker-export_dynamic-Xlinker-no-deduplicate-fembed位代码标记-fobjc arc-fobj链接运行时-Xlinker–dependency_info-Xlinker/用户/eamonwhite/库/开发人员/Xcode/DerivedData/maggie govvbppylostlwashtkbcuawqzc/构建/中介.noindex/maggie.Build/Debug-iphoneos/maggie-Build/Objects-normal/arm64/maggie_dependency _info.dat-o/用户/eamon white/库/开发人员/XXcode/Derivatedata/maggie-govvbppylostlwashtkbuaqqzc/构建/产品/调试iphoneos/maggie.app/maggie

    在以下位置重复符号“_OBJC_CLASS_$_PersistentContainer”: /用户/eamonwhite/库/开发人员/Xcode/衍生数据/maggie govvbppylostlwaashtkbcuawqzc/构建/中介.noindex/maggie.Build/Debug-iphoneos/maggie.Build/对象-normal/arm64/AppDelegate。o /用户/eamonwhite/库/开发人员/Xcode/派生数据/maggie govvbppylostlwaashtkbcuawqzc/构建/中介.noindex/maggie.Build/Debug-iphoneos/maggie.Build/对象-normal/arm64/ViewController。o 在以下位置重复符号“_OBJC_METACLASS_$_PersistentContainer”: /用户/eamonwhite/库/开发人员/Xcode/衍生数据/maggie govvbppylostlwaashtkbcuawqzc/构建/中介.noindex/maggie.Build/Debug-iphoneos/maggie.Build/对象-normal/arm64/AppDelegate。o /用户/eamonwhite/库/开发人员/Xcode/派生数据/maggie govvbppylostlwaashtkbcuawqzc/构建/中介.noindex/maggie.Build/Debug-iphoneos/maggie.Build/对象-normal/arm64/ViewController。o ld:2个结构arm64重复符号clang:错误:链接器 命令失败,退出代码为1(使用-v查看调用)

    在错误的底部,它说哪些文件是重复的:

    _OBJC_CLASS_$_PersistentContainer (又名 PersistentContainer.h ,或提前声明,我不确定) _OBJC_METACLASS_$_PersistentContainer (再说一次,我不知道两者之间有什么区别 METACLASS CLASS ,我假设 元类 这是一个前瞻性的声明,就像 @class ).

    从错误中可以看出,此文件在两个中都是重复的 AppDelegate.o (又名 AppDelegate.h ),以及 ViewController.o (编译版本 ViewController.h )-以下是这些文件的相关部分:

    AppDelegate.h:

    #import <UIKit/UIKit.h>
    #import <CoreData/CoreData.h>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    
    @end
    

    AppDelegate.m:

    #import "AppDelegate.h"
    #import "PersistentContainer.h"
    
    @interface AppDelegate () 
    
    @property (strong, nonatomic) NSManagedObjectContext* managedObjectContext;
    @property (strong, nonatomic) NSPersistentStoreCoordinator* persistentStoreCoordinator;
    @property (strong, nonatomic) NSPersistentStoreAsynchronousFetchResultCompletionBlock callback;
    @property (nonatomic, strong) PersistentContainer *persistentContainer;
    
    - (PersistentContainer*)persistentContainer;
    
    @end
    
    @implementation AppDelegate
    
    ...
    

    ViewController.h:

    #import <UIKit/UIKit.h>
    #import <CoreLocation/CoreLocation.h>
    
    @class PersistentContainer;
    
    @protocol ViewControllerDelegate <NSObject>
    
    - (PersistentContainer*)getPersistentContainer;
    
    @end
    
    @interface ViewController : UIViewController <CLLocationManagerDelegate, ViewControllerDelegate>
    
    @property (weak, nonatomic) id<ViewControllerDelegate> delegate;
    
    @end
    

    ViewController.m:

    #import "ViewController.h"
    #import "HeaderCollection.h"
    #import "PersistentContainer.h"
    
    @interface ViewController ()
    
    @property (nonatomic, strong) CLLocationManager* locationManager;
    @property (nonatomic) UILabel* heading_label;
    @property (nonatomic) UILabel* location_label;
    @property (nonatomic) UILabel* loc_timestamp_label;
    @property (nonatomic) UILabel* heading_accuracy_label;
    @property (nonatomic) UILabel* mag_heading_label;
    @property (nonatomic) UILabel* true_heading_label;
    @property (nonatomic) UILabel* heading_timestamp_label;
    @property (nonatomic) PersistentContainer* persistentContainer;
    
    - (PersistentContainer*)getPersistentContainer;
    
    @end
    
    @implementation ViewController
    
    ...
    

    HeaderCollection。h 不相关,它们只是CoreData模型的头部。

    这是 PersistentContainer.h:

    #import <CoreData/CoreData.h>
    
    @interface PersistentContainerProtocol : NSPersistentContainer
    
    - (void)saveContext;
    
    @end
    
    @interface PersistentContainer : NSPersistentContainer
    
    - (void)saveContext;
    
    @end
    
    @implementation PersistentContainer
    
    - (void)saveContext {
        NSManagedObjectContext *context = [self viewContext];
        NSError *error = nil;
        if ([context hasChanges] && ![context save:&error]) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, error.userInfo);
            abort();
        }
    }
    
    @end
    

    没有 .m 文件为 PersistentContainer -所有内容都在头文件中。

    我通常自己也能得到这种东西,但这件事让我一整天都很恼火,是时候要求一双新的眼睛,或者一个新的策略了。。。谢谢。如果您需要查看其他文件,请告诉我,我意识到这是一个循环导入问题,问题可能在另一个文件中。谢谢。

    0 回复  |  直到 4 年前
        1
  •  1
  •   Cristik    4 年前

    您实际上发现了问题的原因:

    PersistentContainer没有.m文件,所有内容都在头文件中。

    你需要把 @implementation 部分A .m 文件,否则导入的所有其他源文件 PersistentContainer.h 将重新实现该类,从而导致重复的符号定义。这是因为每次导入都相当于在执行导入的文件中写入相同的内容。

    与C++不同,C++允许你在头文件中定义类实现的一部分,在Objective-C中,你必须在实现文件中编写所有的实现。