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.
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" .
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.
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.
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.
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With