将旧的 Mecab 库实现到现代 iOS 应用程序中

Implementing an older Mecab library into a modern iOS app

我正在尝试在我一直在开发的新应用程序中使用 Mecab,但我无法让该库正常工作。最初,我尝试了以下应该与 iOS 6:

兼容的存储库

https://github.com/gumob/mecab

我尝试构建一个通用二进制文件,然后添加库和头文件以及简单地将整个项目添加为依赖项,但在这两种情况下我都遇到了很多错误。所以,我放弃了那个,回到原来的分支:

https://github.com/FLCLjp/iPhone-libmecab

我相信它最初是为 iOS 3 制作的。但是,如果您对该存储库中包含的示例应用程序进行以下更改,该应用程序将构建并 运行 iOS 9.3模拟器和设备:

更改应用委托中的第 26 行

[self.window addSubview:viewController.view];

[self.window setRootViewController:viewController];

为 LibMecabSample 目标和在 Other Sources 文件夹的 mecab.xcodeproj 中找到的 mecab 库目标,将 Build Settings - Architectures 选项更改为 Standard architectures (armv7 arm64)。

由于这个版本似乎工作得很好,我尝试将在该存储库中找到的 mecab.xcodeproj 实现到我的应用程序中。我基本上只是尝试重新创建它在 LibMecabSample 应用程序中的实现方式,一切似乎都是一样的。我什至在文本程序中区分了 xcode 项目文件,以确保我在构建设置中没有任何差异。有一些差异(ARC、启用模块和用户定义的 PREBINDING - 无设置)但更改这些似乎不会影响事情,我在尝试构建时仍然遇到以下错误:

CompileC /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/Mecab.o myApp/Mecab.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler
    cd /Users/username/Developer/myApp
    export LANG=en_US.US-ASCII
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch armv7 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=c99 -fobjc-arc -fmodules -fmodules-cache-path=/Users/username/Library/Developer/Xcode/DerivedData/ModuleCache -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -fbuild-session-file=/Users/username/Library/Developer/Xcode/DerivedData/ModuleCache/Session.modulevalidation -fmodules-validate-once-per-build-session -Wnon-modular-include-in-framework-module -Werror=non-modular-include-in-framework-module -Wno-trigraphs -fpascal-strings -O0 -fno-common -Wno-missing-field-initializers -Wno-missing-prototypes -Werror=return-type -Wunreachable-code -Wno-implicit-atomic-properties -Werror=deprecated-objc-isa-usage -Werror=objc-root-class -Wno-arc-repeated-use-of-weak -Wduplicate-method-match -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wconditional-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -DOBJC_OLD_DISPATCH_PROTOTYPES=0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk -fstrict-aliasing -Wprotocol -Wdeprecated-declarations -miphoneos-version-min=9.3 -g -Wno-sign-conversion -fembed-bitcode-marker -I/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/myApp.hmap -I/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos/include -I/Users/username/Developer/myApp/myApp -I/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/DerivedSources/armv7 -I/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/DerivedSources -F/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos -fno-objc-arc -include /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/PrecompiledHeaders/LibMecabSample_Prefix-djuzfnofhgzpgqhajbqeodymirzc/LibMecabSample_Prefix.pch -MMD -MT dependencies -MF /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/Mecab.d --serialize-diagnostics /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/Mecab.dia -c /Users/username/Developer/myApp/myApp/Mecab.m -o /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/Mecab.o

In file included from /Users/username/Developer/myApp/myApp/Mecab.m:12:
/Users/username/Developer/myApp/myApp/Mecab.h:13:2: error: unknown type name 'mecab_t'
        mecab_t *mecab;
        ^
/Users/username/Developer/myApp/myApp/Mecab.m:29:11: warning: implicit declaration of function 'mecab_new2' is invalid in C99 [-Wimplicit-function-declaration]
                mecab = mecab_new2([[@"-d " stringByAppendingString:path] UTF8String]);
                        ^
/Users/username/Developer/myApp/myApp/Mecab.m:32:49: warning: implicit declaration of function 'mecab_strerror' is invalid in C99 [-Wimplicit-function-declaration]
                        fprintf(stderr, "error in mecab_new2: %s\n", mecab_strerror(NULL));
                                                                     ^
/Users/username/Developer/myApp/myApp/Mecab.m:32:49: warning: format specifies type 'char *' but the argument has type 'int' [-Wformat]
                        fprintf(stderr, "error in mecab_new2: %s\n", mecab_strerror(NULL));
                                                              ~~     ^~~~~~~~~~~~~~~~~~~~
                                                              %d
/Users/username/Developer/myApp/myApp/Mecab.m:38:8: error: unknown type name 'mecab_node_t'
        const mecab_node_t *node;
              ^
/Users/username/Developer/myApp/myApp/Mecab.m:42:9: warning: implicit declaration of function 'mecab_sparse_tonode2' is invalid in C99 [-Wimplicit-function-declaration]
        node = mecab_sparse_tonode2(mecab, buf, l);
               ^
/Users/username/Developer/myApp/myApp/Mecab.m:65:3: warning: implicit declaration of function 'mecab_destroy' is invalid in C99 [-Wimplicit-function-declaration]
                mecab_destroy(mecab);
                ^
5 warnings and 2 errors generated.

CompileC /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/Mecab.o myApp/Mecab.m normal arm64 objective-c com.apple.compilers.llvm.clang.1_0.compiler
    cd /Users/username/Developer/myApp
    export LANG=en_US.US-ASCII
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch arm64 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=c99 -fobjc-arc -fmodules -fmodules-cache-path=/Users/username/Library/Developer/Xcode/DerivedData/ModuleCache -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -fbuild-session-file=/Users/username/Library/Developer/Xcode/DerivedData/ModuleCache/Session.modulevalidation -fmodules-validate-once-per-build-session -Wnon-modular-include-in-framework-module -Werror=non-modular-include-in-framework-module -Wno-trigraphs -fpascal-strings -O0 -fno-common -Wno-missing-field-initializers -Wno-missing-prototypes -Werror=return-type -Wunreachable-code -Wno-implicit-atomic-properties -Werror=deprecated-objc-isa-usage -Werror=objc-root-class -Wno-arc-repeated-use-of-weak -Wduplicate-method-match -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wconditional-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wshorten-64-to-32 -Wpointer-sign -Wno-newline-eof -Wno-selector -Wno-strict-selector-match -Wundeclared-selector -Wno-deprecated-implementations -DDEBUG=1 -DOBJC_OLD_DISPATCH_PROTOTYPES=0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk -fstrict-aliasing -Wprotocol -Wdeprecated-declarations -miphoneos-version-min=9.3 -g -Wno-sign-conversion -fembed-bitcode-marker -I/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/myApp.hmap -I/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos/include -I/Users/username/Developer/myApp/myApp -I/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/DerivedSources/arm64 -I/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/DerivedSources -F/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos -fno-objc-arc -include /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/PrecompiledHeaders/LibMecabSample_Prefix-fbzdoofsvssuyecvsrlrazplcjeo/LibMecabSample_Prefix.pch -MMD -MT dependencies -MF /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/Mecab.d --serialize-diagnostics /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/Mecab.dia -c /Users/username/Developer/myApp/myApp/Mecab.m -o /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/Mecab.o

In file included from /Users/username/Developer/myApp/myApp/Mecab.m:12:
/Users/username/Developer/myApp/myApp/Mecab.h:13:2: error: unknown type name 'mecab_t'
        mecab_t *mecab;
        ^
/Users/username/Developer/myApp/myApp/Mecab.m:29:11: error: implicit declaration of function 'mecab_new2' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
                mecab = mecab_new2([[@"-d " stringByAppendingString:path] UTF8String]);
                        ^
/Users/username/Developer/myApp/myApp/Mecab.m:32:49: error: implicit declaration of function 'mecab_strerror' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
                        fprintf(stderr, "error in mecab_new2: %s\n", mecab_strerror(NULL));
                                                                     ^
/Users/username/Developer/myApp/myApp/Mecab.m:32:49: warning: format specifies type 'char *' but the argument has type 'int' [-Wformat]
                        fprintf(stderr, "error in mecab_new2: %s\n", mecab_strerror(NULL));
                                                              ~~     ^~~~~~~~~~~~~~~~~~~~
                                                              %d
/Users/username/Developer/myApp/myApp/Mecab.m:38:8: error: unknown type name 'mecab_node_t'
        const mecab_node_t *node;
              ^
/Users/username/Developer/myApp/myApp/Mecab.m:42:9: error: implicit declaration of function 'mecab_sparse_tonode2' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        node = mecab_sparse_tonode2(mecab, buf, l);
               ^
/Users/username/Developer/myApp/myApp/Mecab.m:65:3: error: implicit declaration of function 'mecab_destroy' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
                mecab_destroy(mecab);
                ^
1 warning and 6 errors generated.

Ld /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/myApp normal armv7
    cd /Users/username/Developer/myApp
    export IPHONEOS_DEPLOYMENT_TARGET=9.3
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk -L/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos -L/Users/username/Developer/myApp -F/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos -filelist /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/myApp.LinkFileList -miphoneos-version-min=9.3 -dead_strip -Xlinker -no_deduplicate -fembed-bitcode-marker -ObjC -fobjc-arc -fobjc-link-runtime -lstdc++ -liconv -framework CoreGraphics -framework UIKit -framework Foundation /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos/libmecab.a -Xlinker -dependency_info -Xlinker /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/myApp_dependency_info.dat -o /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/myApp

ld: file not found: /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/Mecab.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Ld /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/myApp normal arm64
    cd /Users/username/Developer/myApp
    export IPHONEOS_DEPLOYMENT_TARGET=9.3
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk -L/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos -L/Users/username/Developer/myApp -F/Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos -filelist /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/myApp.LinkFileList -miphoneos-version-min=9.3 -dead_strip -Xlinker -no_deduplicate -fembed-bitcode-marker -ObjC -fobjc-arc -fobjc-link-runtime -lstdc++ -liconv -framework CoreGraphics -framework UIKit -framework Foundation /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos/libmecab.a -Xlinker -dependency_info -Xlinker /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/myApp_dependency_info.dat -o /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/myApp

ld: file not found: /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/Mecab.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)

CreateUniversalBinary /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos/myApp.app/myApp normal armv7\ arm64
    cd /Users/username/Developer/myApp
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo -create /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/myApp /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/myApp -output /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Products/Debug-iphoneos/myApp.app/myApp

fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't open input file: /Users/username/Library/Developer/Xcode/DerivedData/myApp-alstnncsvqtenwfmppcsobrovoao/Build/Intermediates/myApp.build/Debug-iphoneos/myApp.build/Objects-normal/armv7/myApp (No such file or directory)

我不确定这是否只是一个链接器问题,或者可能与 C 编译器有关,但我已经研究了几天,但似乎无法弄清楚。如果有人能提供小费,我将不胜感激。

花了几个小时才弄明白,但我让它开始工作了。知道了步骤其实也没那么难

好的,首先,手动将 mecab 文件夹复制到您的项目文件夹(否则它不会起作用。然后右键单击项目的顶部树对象并 select“添加文件” .

Select mecab 文件夹中的 mecab.xcodeproj 文件。它应该已经添加到您的项目树及其子文件夹中,然后是所有 类.

然后将 Mecab.h/.m 和 Node.h/.m 文件拖到您的项目中,确保您 select 复制它们。

然后转到项目的目标并在 build phases 中添加这三个库。

然后转到 build settings 中的 "header search paths" 并将路径添加到您的 mecab 文件夹。如果你像我一样将它复制到你的项目文件夹,那么它看起来就像这样。

然后将 IPADic 文件夹拖到您的项目中,注意不要将其放在 mecab.xcproj 子文件夹下。你想要它在你的主包中,否则 mecab 找不到它。

然后清理并构建。它应该 有效。我只是将它添加到应用程序委托中并为其提供了一个测试字符串,然后设置了一个断点。成功了!