質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Q&A

3回答

5061閲覧

mecabとCを使ったVisual stuido 2019での環境を整えたい。

KZK13

総合スコア43

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

0グッド

1クリップ

投稿2020/06/26 04:53

編集2020/06/29 16:43

問題は見つかりませんでしたと表示されながらも以下のようにエラーが出ます。

1>------ ビルド開始: プロジェクト: ConsoleApplication1, 構成: Release x64 ------ 1>ConsoleApplication1.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) class MeCab::Tagger * __cdecl MeCab::createTagger(char const *)" (__imp_?createTagger@MeCab@@YAPEAVTagger@1@PEBD@Z)" は未解決です。 1>C:\Users\Desktop\ConsoleApplication1\x64\Release\ConsoleApplication1.exe : fatal error LNK1120: 1 件の未解決の外部参照 1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました -- 失敗。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

コンソールアプリで新規作成をして、
追加の依存ファイルにlibmecab.libを入力。
追加のインクルードディレクトリにC:\Program Files (x86)\MeCab\sdkを入力。
追加のライブラリディレクトリにC:\Program Files (x86)\MeCab\sdkを入力。

環境はWindows10、visual studio 2019、mecab。

以下のソースをビルドしました。

#include <iostream> #include <mecab.h> int main(int argc, char** argv) { char input[1024] = "ジョニーは戦場へ行った"; MeCab::Tagger* tagger = MeCab::createTagger(""); const char* result = tagger->parse(input); std::cout << result << std::endl; delete tagger; }

新しくこちらのコードをビルドしてコマンドプロンプトで実行ファイルは得られましたが、
Exception:としか表示されませんでした。

#include <mecab.h> #include <stdio.h> #define CHECK(eval) if (! eval) { \ fprintf (stderr, "Exception:%s\n", mecab_strerror (mecab)); \ mecab_destroy(mecab); \ return -1; } int main(int argc, char** argv) { char input[] = "太郎は次郎が持っている本を花子に渡した。"; mecab_t* mecab; const mecab_node_t* node; const char* result; int i; size_t len; // Create tagger object mecab = mecab_new(argc, argv); CHECK(mecab); // Gets tagged result in string. result = mecab_sparse_tostr(mecab, input); CHECK(result) printf("INPUT: %s\n", input); printf("RESULT:\n%s", result); // Gets N best results result = mecab_nbest_sparse_tostr(mecab, 3, input); CHECK(result); fprintf(stdout, "NBEST:\n%s", result); CHECK(mecab_nbest_init(mecab, input)); for (i = 0; i < 3; ++i) { printf("%d:\n%s", i, mecab_nbest_next_tostr(mecab)); } // Gets node object node = mecab_sparse_tonode(mecab, input); CHECK(node); for (; node; node = node->next) { if (node->stat == MECAB_NOR_NODE || node->stat == MECAB_UNK_NODE) { fwrite(node->surface, sizeof(char), node->length, stdout); printf("\t%s\n", node->feature); } } // Dictionary info const mecab_dictionary_info_t* d = mecab_dictionary_info(mecab); for (; d; d = d->next) { printf("filename: %s\n", d->filename); printf("charset: %s\n", d->charset); printf("size: %d\n", d->size); printf("type: %d\n", d->type); printf("lsize: %d\n", d->lsize); printf("rsize: %d\n", d->rsize); printf("version: %d\n", d->version); } mecab_destroy(mecab); return 0; }

ジュニーは戦場に行ったのプログラムで画像のフォルダの内容でコマンドプロンプトを開きcdコマンドで移動して実行しましたが、何も表示されないまま終わってしまいます。
何がいけないのでしょうか?
フォルダの内容でコマンドプロンプトを開きcdコマンドで移動して実行しました画像

先ほどデバッグをしたところ画像のようなエラー?のようなものが見受けられました。
調べてみます。
エラーのような画像
こちらはデバッグ後の情報です。

スレッド 0x2878 はコード 0 (0x0) で終了しました。 例外がスローされました:読み取りアクセス違反。 **tagger** が nullptr でした。 プログラム '[29984] ConsoleApplication1.exe' はコード 0 (0x0) で終了しました。

デバッグ中の値の中身です。input[1024]の中身が怪しい感じですが、皆さんの方でも同じような感じなのでしょうか。
デバッグ中の値の中身です。

mecab-ipadic-2.7.0-20070801.tar.gzはetcの中に入っています。

C:\Program Files (x86)\MeCabのにインストールしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bull

2020/06/27 12:34

デバッグの画面を見ると、Debug x64 みたいですが、DLL はコンパイルし直したのでしょうか?
Bull

2020/06/27 12:46

よく見たら、起動しているのは win32 ですね。 しかし、ソリューション プラットフォームは x64 になっています。 どうやって起動したのでしょうか。
KZK13

2020/06/27 12:52

すいません。どうやってかはわかないのですが、x86に変更しました。ですが問題は依然と変わらずです。
Bull

2020/06/27 13:05

libmecab.dll が破損している可能性もありますので、mecab コマンドが正常動作するかどうか、確認してみてください。
Bull

2020/06/27 23:31 編集

辞書をどこから読んでいるのかわからなかったので、ちょっと調べてみました。 Configuration file (mecabrc) で辞書を指定していて、mecabrc はレジストリでディレクトリを指定してるようです。 インストールが不完全だったり、インストールしたフォルダを移動したりすると、辞書が見付からずエラーになります。 インストール後、環境を変更していませんか?
Penpen7

2020/06/28 01:05 編集

試しにmacab/dicにある辞書をフォルダごと削除して同様のエラーが発生したので、辞書があるorインストール先からフォルダを移動していないかを確認したほうが良さそうですね taggerがNULLで落ちました
KZK13

2020/06/28 07:33

お手数をおかけしてすいません。辞書のダウンロードをしていなかったので サイトからIPA 辞書をダウンロードして同じフォルダにコピーした後、コマンドプロンプトで cdでdllと辞書の入ってるフォルダに移動した後、実行をしてみましたが、依然と変わらず何も表示されず終了してしまいます。 なのでインストール先からフォルダを移動していないかを確認します。 お二方どうもありがとうございます。
KZK13

2020/06/28 07:39

元々はmecabはC:\Program Files (x86)\MeCab\binの方にインストールされています。 VS2019のプロジェクトがあるのはデスクトップなので、そこにlibmecab.dllとmecab-ipadic-2.7.0-20070801.tar.gzをコピーしてcdでディレクトリを変えて実行しました。しかしうまくいかず、 その逆にデスクトップでの実行ファイルをC:\Program Files (x86)\MeCab\binの方にコピーしてcdでディレクトリをC:\Program Files (x86)\MeCab\binに変えて実行しましたが、同じように何も表示されませんでした。
Bull

2020/06/28 09:13 編集

libmecab.dll や辞書ファイルだけをコピーしてもだめですね。 mecab をインストールして下さい。 Windows のインストーラーは辞書を含んでいますので、別途、辞書をコピーする必要はないはずです。 レジストリを変更すればできるかもしれませんが、現状余りお勧めできません。
KZK13

2020/06/28 09:30

>>libmecab.dll や辞書ファイルだけをコピーしてもだめですね。 はい、一応それ以外の本体?もダウンロードしたと思うのですが、 Binary package for MS-Windowsの mecab-0.996.exe:ダウンロード がmecab本体ではないのでしょうか?
Bull

2020/06/28 09:38

インストールはしたのでしょうか? 以前書きましたが、mecab コマンドは正常動作したのでしょうか? レジストリの HKEY_CURRENT_USER\Software\MeCab はどうなっていますか?
KZK13

2020/06/28 09:42

インストールもしました。 すいません。mecab コマンドをすぐに確認できるような簡単なコマンドはないでしょうか。 >>レジストリの HKEY_CURRENT_USER\Software\MeCab はどうなっていますか? すいません。確認の仕方がわからなくてよくわかっていません。
Bull

2020/06/28 09:47

mecab コマンドとは、C:\Program Files (x86)\MeCab\bin\mecab.exe の事です。これを起動して、何か文章を入力して下さい。正常動作していれば、何らかの反応があるはずです。 レジストリはコマンドラインで、 reg query HKCU\Software\MeCab として下さい。
KZK13

2020/06/28 10:00

ご親切にありがとうございます。 https://techacademy.jp/magazine/22052のサイトとBullさんのを参考に コマンドプロンプトで「mecab」を入力しました。 param.cpp(69) [ifs] no such file or directory: C:\MeCab\etc\mecabrcと表示されました。 インストールも問題なく新しくできましたし、環境変数のpathもちゃんとそのままコピーして書いたのになぜ正しく作動しないのか。 正しいかわからないのですが、以下のようにしたところ C:\Program Files (x86)\MeCab\bin>cd reg query HKCU\Software\MeCab 指定されたパスが見つかりません。 と出ました。やはりpathが正しく通っていないのかもしれません。
Bull

2020/06/28 10:06

正常にインストールされていないようですね。 再インストールしてみては如何でしょうか。 レジストリはフォルダではありません。 ここでレジストリの説明はできないので、ご自身で検索するなりして勉強して下さい。 reg は Windows のコマンドです。 コマンドプロンプトでそのまま実行してみて下さい。
KZK13

2020/06/28 10:09

どうもありがとうございます。 ちなみに、インストールするのはBinary package for MS-Windows mecab-0.996.exe:ダウンロードで合っていますでしょうか。
KZK13

2020/06/28 10:58

そうです!
KZK13

2020/06/28 12:05 編集

ちなみに、先ほども書きましたがデバッグすると ハンドルされない例外がスローされました:読み取りアクセス違反。 **tagger** が nullptr でした。 例外がスローされました:読み取りアクセス違反。 **tagger** が nullptr でした。 と表示されるのですが、これはインストールが正しくされていないためでしょうか?
Bull

2020/06/28 12:31

ええ、そうですね。 mecab コマンドのエラーを見ると、"C:\MeCab" にインストールしたのではないでしょうか? "C:\MeCab\etc\mecabrc" は "Configuration file" ですが、それが読み込めていないということのようです。 MeCab::createTagger("") が何をやっているのかよく判らないですが、多分内部で、初期化して辞書を読んでいると思われます。辞書の場所は mecabrc に書かれていますが、それが読み込めていないので、エラーになって NULL を返したのでしょう。 ここが正常に動かないと、プログラムが動くはずもありません。 mecab コマンドも概ね同じような事を行っていると推測されます。mecab コマンドが正しく動作しないことには、作ったプログラムも動作するとは思えません。mecab コマンドが正常動作させることが先決です。
KZK13

2020/06/28 12:39

はい、C:\Program Files (x86)\MeCab のMeCabにインストールしました。
KZK13

2020/06/28 15:08

param.cpp(69) [ifs] no such file or directory: C:\MeCab\etc\mecabrc と出ましたが、編集で添付した画像より、ectの中に辞書となるmecab-ipadic-2.7.0-20070801.tar.gzを入れています。
Bull

2020/06/29 02:55

レジストリの情報とインストール フォルダに不整合があるように思えます。 このような状況で闇雲に何かをしても、状況が悪化するだけのような気がします。 再インストール(アンインストールしてからインストール)した方が良いのではないですか。 Windows 向けのパッケージには辞書が同梱されていますので、動作確認するだけでしたらあらためて辞書をインストールする必要はないはずです。 また、辞書のインストール方法も間違っているように思います。
KZK13

2020/06/29 07:00

https://taku910.github.io/mecab/#download のIPA 辞書をダウンロードしてC:\Program Files (x86)\MeCab\etcの中にコピペしていたのですが、 どうかどこに置けばいいか正しい方法を教えてください。
Penpen7

2020/06/29 08:15 編集

Binary package for MS-Windows mecab-0.996.exe:ダウンロード の下に 「Windows 版には コンパイル済みの IPA 辞書が含まれています」 と書いてありますよね?すなわちIPA辞書のダウンロードは必要ありませんので、mecab-0.996.exeを開いてインストールするだけでとりあえず使える状態にあるということです。実際私も別途、何か辞書のダウンロードをしていませんし、回答にも辞書を入れたとは書いておりません。
KZK13

2020/06/29 08:45

そうなのですが、いくらやってもエラーが出るので、もしかしたら辞書が正しく入っていないのではないかと思って聞いてみました。
Penpen7

2020/06/29 16:02 編集

C:\Program Files (x86)\MeCabにインストールしたんですよね? スクリーンショットだとC:\Mecabとなってますが アンインストールするとレジストリは消えたので再インストールで治ると思います。 最悪、レジストリキーをいじれば治ると思いますが、Windowsが壊れかねないので怖いです。
KZK13

2020/06/29 16:43

>>C:\Program Files (x86)\MeCabにインストールしたんですよね? はい!編集した画像に載せた場所にインストールしました。
asm

2020/06/29 18:41

C:\Program Files(x86)以下だとVirtualStoreで面倒くさい事になりかねない印象 とくに後からダウンロードしてコピペなんてやった場合
guest

回答3

0

いろいろとverが古いかもしれませんが、一応こちらでも動くことは確認しました。
環境 : Windows8.1, Visual Studio Professional 2013(Version 12.0.31101.00 Update 4), Visual C++2013, .Net Framework Version 4.7.03062

  1. https://taku910.github.io/mecab/からBinary package for MS-Windowsをダウンロード、インストール。文字コードはshift-jisとした
  2. Win32コンソールアプリケーションでプロジェクトを作成
  3. 構成プロパティVC++ディレクトリで、C:\Program Files (x86)\MeCab\sdkをインクルードディレクトリ、ライブラリディレクトリに指定

パス指定
4. mecab/bin/libmecab.dllをexeファイルと同じところにコピー
4. cppソースコードとして以下を使用

c++

1#include <iostream> 2#include <mecab.h> 3#pragma comment(lib, "libmecab.lib") 4 5int main(int argc, char** argv) { 6 char input[1024] = "ジョニーは戦場へ行った"; 7 8 MeCab::Tagger* tagger = MeCab::createTagger(""); 9 const char* result = tagger->parse(input); 10 11 std::cout << result << std::endl; 12 13 delete tagger; 14}
  1. ビルドおよび実行

実行結果
構成

投稿2020/06/27 10:38

編集2020/06/27 10:46
Penpen7

総合スコア698

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KZK13

2020/06/27 11:04

ご親切にどうもありがとうございます。 書いた通りにダウンロードからやり直しでやってみました。ですが、なぜか前回と同じような結果で何も表示されませんでした。 2019での対応ができていないのか、私にミスがあるのか。 こうなったら2013年のでやってみます。期待に沿えずほんとにすいません。 原因がわかりましたら書きます。
episteme

2020/06/27 11:21

最新mecab-0.996 + Visual Studio 2019 で何の問題もなかったんやけどなぁ...
Penpen7

2020/06/27 11:24

画像ではdelete taggerの行で設定してます。(赤丸の部分)
Penpen7

2020/06/27 11:32 編集

今手持ちがたまたま2013だったのでそれでやったのですが、epistemeさんがやられている通り2019でできているわけですから、わざわざ2013でやる必要はないと思いますね…それにしても表示されないのは謎です
Bull

2020/06/27 12:47 編集

私も時々思い出したように mecab を使うことがあります。 0.98 を暫く使っていましたが、この機会に最新の 0.996 をダウンロードしましたが、問題なく使用できました。 Windows7 Visual Studio 2019 Debug x86 です。
KZK13

2020/07/06 12:29

なぜかわからないのですが、もう一度インストールしてPenpen7さんの方法で実行したらうまくいきました。 どうもありがとうございます。 コマンドプロンプトをlibmecab.dllと実行ファイルのある場所に移動して実行しました。 以前も同じように実行しましたがなぜかうまくいかず、改めて行ったところうまくいきました。
SHOMI

2020/08/07 21:07

うまく行ったのであれば解決済みにしてください。
guest

0

libmecab.libを追加していないだけでは?

libmecab.lib

なお、実行時はexeと同じ場所(またはPATHが通った場所)にlibmecab.dllを置いておく必要がある。

libmecab.dll

また、Windowsのmecabバイナリはx86オンリーなのでx86でコンパイルすること。x64で使いたい場合は、自分でコンパイルし直さないといけない。

ぶっちゃけ、Mecab使うなら、Linuxの方がパッケージで簡単に入れられるし、楽だと思います。

投稿2020/06/26 13:23

編集2020/06/26 13:24
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2020/06/26 13:28

あ、追加の依存ファイルは書いてあったのね。追加の依存ファイルを付けないと同じエラーだったから見逃してた。 この回答は忘れて下さい。
KZK13

2020/06/26 13:47 編集

raccyさん、ありがとうございます。 >>実行時はexeと同じ場所(またはPATHが通った場所)にlibmecab.dllを置いておく必要がある。 はい、私も入れています。PATHの方も通しました。 デバッグでビルドしたところ問題なくビルドできました。しかし、まだ依然と同じようにコマンドプロンプトが出た後に何もなく、文字も出ずに十秒ほどで勝手に消えてしまいます。 お手数をおかけして申し訳ないのですが、どうやってVS2019で正しく実行できるようになったまでの手順を詳しく教えて頂けないでしょうか。ちなみに、私の方ではraccyさんの載せて頂いた写真の中の拡張子がtxtというファイルだけなかったのですが、このファイルがないためうまくいかないことはあるのでしょうか? またどうやってそのtxtファイルを出力したのでしょうか。 どうかお願いいたします。
guest

0

問題ありません/再現しません。

C:\Program Files\MeCab\sdk>cl -EHsc -I. -DDLL_IMPORT trial.cpp libmecab.lib Microsoft(R) C/C++ Optimizing Compiler Version 19.26.28806 for x64 Copyright (C) Microsoft Corporation. All rights reserved. trial.cpp Microsoft (R) Incremental Linker Version 14.26.28806.0 Copyright (C) Microsoft Corporation. All rights reserved. /out:trial.exe trial.obj libmecab.lib C:\Program Files\MeCab\sdk>trial ジョニー 名詞,固有名詞,人名,名,*,*,ジョニー,ジョニー,ジョニー は 助詞,係助詞,*,*,*,*,は,ハ,ワ 戦場 名詞,一般,*,*,*,*,戦場,センジョウ,センジョー へ 助詞,格助詞,一般,*,*,*,へ,ヘ,エ 行っ 動詞,自立,*,*,五段・カ行促音便,連用タ接続,行く,イッ,イッ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ EOS

投稿2020/06/26 06:19

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KZK13

2020/06/26 06:20

同じようにvisual studio2019で私の書いた方法で実行しても問題なかったのですか?
episteme

2020/06/26 06:21

やってません。やったのはコマンドラインからのコンパイルのみ。
KZK13

2020/06/26 06:44

お時間のある時で構いませんので、できればvisual studioのやり方でやって頂けるとありがたいです。 無理ならば大丈夫です。
episteme

2020/06/26 06:45

やってみた。再現しません。
dodox86

2020/06/26 06:50

> 1>C:\Users\Desktop\ConsoleApplication1\x64\Release\ConsoleApplication1.exe : fatal error LNK1120: 1 件の未解決の外部参照 "x64"でビルドするからダメなのです。"C:\Program Files (x86)..."のライブラリなのだから、MeCabで提供されるライブラリは、"x86"(32ビット)版です。
KZK13

2020/06/26 07:38

ありがとうございます。 構成はrelease、プラットフォームはすべてのプラットフォームに変えて releaseでx86に変えたところビルドできました。しかし実行ファイルをクリックするとコマンドプロンプトが10秒程度表示されてなにも起こらずに閉じてしまいます。
episteme

2020/06/26 07:42

libmecab.dll のパスは通ってます?
KZK13

2020/06/26 07:46 編集

通ってないかもしれません、あのlibの通し方は知ってるのですが、dllの通し方は知りません。 というかvisual studioのどこに書けばいいかわかりません。どうか教えてください。 環境変数のpathの方には通しました。
episteme

2020/06/26 07:48 編集

いちばん簡単なのは「~.exeと同じdir.にコピーする」 あ、pathで通したんなら問題ないハズ。
dodox86

2020/06/26 07:50

ご質問のもともとの主旨はビルド時のエラーの解消だったはずですので、私は以降のコメントは控えます。尚、libmecab.dllさえ配置してしまえば当方でのVisual Studio 2019/x86ビルドでの実行結果はepistemeさんのものと同じでした。
KZK13

2020/06/26 08:10

あの、 いちばん簡単なのは「~.exeと同じdir.にコピーする」 について、もう少し詳しく教えて下さい。dirとはどこでしょうか? 実行する際のコマンドプロンプトと一緒にdllもコピペして実行するという事でしょうか? dodox86さんありがとうございます。
episteme

2020/06/26 08:21

...それ僕に訊くこと? Visual Studioに訊きなさい。
KZK13

2020/06/26 11:43 編集

Visual Studioで知らべたりしているうちに過去のサイトに行きつきました。 https://teratail.com/questions/72271 libmecab.dllをexeと同じファイルに入れて実行してみたのですが、特に変化はありませんでした。 環境変数での確認もしたのに何がいけないのか。 新しく編集して載せたコードをビルドしてコマンドプロンプトで実行ファイルは得られましたが、 Exception:としか表示されませんでした。
Penpen7

2020/06/26 14:25 編集

古いコードでは解決できていないのに、なぜ新しいコードが登場したんでしょうか... 問題を複雑にするだけでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問