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

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

ただいまの
回答率

89.13%

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 782

KZK13

score -8

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

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のにインストールしました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Penpen7

    2020/06/30 00:56 編集

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

    キャンセル

  • KZK13

    2020/06/30 01:43

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

    キャンセル

  • asm

    2020/06/30 03:41

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

    キャンセル

回答 3

+1

いろいろと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ファイルと同じところにコピー
  5. cppソースコードとして以下を使用
#include <iostream>
#include <mecab.h>
#pragma comment(lib, "libmecab.lib")

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;
}
  1. ビルドおよび実行
    実行結果
    構成

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/27 20:24

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

    キャンセル

  • 2020/06/27 20:29 編集

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

    キャンセル

  • 2020/06/27 21:33 編集

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

    キャンセル

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 17:21

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

    キャンセル

  • 2020/06/26 20:33 編集

    Visual Studioで知らべたりしているうちに過去のサイトに行きつきました。
    https://teratail.com/questions/72271

    libmecab.dllをexeと同じファイルに入れて実行してみたのですが、特に変化はありませんでした。
    環境変数での確認もしたのに何がいけないのか。

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

    キャンセル

  • 2020/06/26 22:57 編集

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

    キャンセル

0

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

libmecab.lib

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

libmecab.dll

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/26 22:28

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

    この回答は忘れて下さい。

    キャンセル

  • 2020/06/26 22:39 編集

    raccyさん、ありがとうございます。
    >>実行時はexeと同じ場所(またはPATHが通った場所)にlibmecab.dllを置いておく必要がある。
    はい、私も入れています。PATHの方も通しました。
    デバッグでビルドしたところ問題なくビルドできました。しかし、まだ依然と同じようにコマンドプロンプトが出た後に何もなく、文字も出ずに十秒ほどで勝手に消えてしまいます。

    お手数をおかけして申し訳ないのですが、どうやってVS2019で正しく実行できるようになったまでの手順を詳しく教えて頂けないでしょうか。ちなみに、私の方ではraccyさんの載せて頂いた写真の中の拡張子がtxtというファイルだけなかったのですが、このファイルがないためうまくいかないことはあるのでしょうか?
    またどうやってそのtxtファイルを出力したのでしょうか。
    どうかお願いいたします。

    キャンセル

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

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る