Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing an older Mecab library into a modern iOS app

Tags:

I'm trying to use Mecab within a new app that I've been working on but I'm having trouble getting the library to work correctly. Originally, I tried the following repository which is supposed to be compatible with iOS 6:

https://github.com/gumob/mecab

I tried building a universal binary and then adding the library and header files as well as simply adding the entire project as a dependency but in both cases I ended up with a lot of errors. So, I gave up on that one and went back to the original that it was forked from:

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

I believe that one was originally made for iOS 3. However, if you make the following changes to the sample app that's included in that repository, the app will build and run on iOS 9.3 simulators and devices:

Change line 26 in the app delegate from

[self.window addSubview:viewController.view];

to

[self.window setRootViewController:viewController];

Change the Build Settings - Architectures option to Standard architectures (armv7 arm64) for both the LibMecabSample target and the mecab library target found in the mecab.xcodeproj in the Other Sources folder.

Since this version seems to work just fine, I tried implementing the mecab.xcodeproj found in that repository into my app. I basically tried to just recreate the way it's implemented in the LibMecabSample app and everything seems to be the same. I even differenced the xcode project files in a text program to make sure I didn't have any differences in the build settings. There were a couple of differences (ARC, Enable Modules, and a user defined PREBINDING - No setting) but changing those doesn't seem to affect things and I'm still getting the following errors when I try to build:

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)

I'm not sure if this is just a linker issue or perhaps something to do with the C compiler but I've been tinkering around with it for a couple of days but can't seem to figure it out. If anyone could provide a tip, I'd really appreciate it.

like image 628
lxmmxl56 Avatar asked May 24 '16 05:05

lxmmxl56


1 Answers

Took hours to figure it out but I got it to work. It's actually not that difficult once you know the steps.

Ok first, manually copy the mecab folder to your project folder (It wouldn't work otherwise. Then right click on the top tree object of your project and select 'add files" .

enter image description here

Select the mecab.xcodeproj file in the mecab folder. It should have been added to your project tree, as well as it's subfolders and then all of the classes.

Then drag the Mecab.h/.m and Node.h/.m files into your project, making sure you select to copy them.

Then go to your project's target and in build phases add these three libraries.

enter image description here

Then go to "header search paths" in build settings and add the path to your mecab folder. If you copied it to your project's folder like I did then it would just look like this.

enter image description here

Then drag over the IPADic folder into your project, being careful not to get it under the mecab.xcproj subfolder. You want it in your main bundle otherwise mecab wont find it.

enter image description here

Then clean and build. It should work. I just added this into the app delegate and fed it a test string and set a breakpoint afterwards. It worked!

enter image description here

like image 76
Joseph Toronto Avatar answered Oct 03 '22 13:10

Joseph Toronto