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

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

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

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

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

Q&A

解決済

1回答

6263閲覧

visual studio 2019でmingw-w64のライブラリを使う手順

nekotoinu

総合スコア1

C

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

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

0グッド

0クリップ

投稿2020/04/25 10:53

編集2020/04/27 13:48

前提・実現したいこと

visual studio 2019でmingw-w64のライブラリを使いたいです。
visual studioのリンカの設定など正しい構成を教えてください。
(回答の結果 onigurumaの正規表現を使う手順を追加)

発生している問題・エラーメッセージ

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK1120 1 件の未解決の外部参照 consoleapp
rications C:\Users\na\source\repos\consoleapprications\x64\Debug\consoleapprications.exe 1
エラー LNK2019 未解決の外部シンボル ___chkstk_ms が関数 set_regs.isra.37 で参照されました。 consoleapprications C:\Users\na\source\repos\consoleapprications\libregex.a(libgnurx_la-regex.o) 1

該当のソースコード

c言語 file.c

#include <stdio.h> #include <malloc.h> #include <regex.h> int main(void) { char string[] = "abc, def, ghi"; const char regex[] = "([a-z]+), ([a-z]+), ([a-z]+)"; regex_t ptn_buf; regmatch_t* match_buf; size_t size; int si, ei; size_t i; /* compile */ if (regcomp(&ptn_buf, regex, REG_EXTENDED | REG_NEWLINE) != 0) { printf("regex compile failed\n"); return 1; } /* allocate match buffer */ size = ptn_buf.re_nsub + 1; match_buf = malloc(sizeof(regmatch_t) * size); if (match_buf == NULL) { printf("no memory\n"); goto err_ptn; } /* match */ if (regexec(&ptn_buf, string, size, match_buf, 0) != 0) { printf("no match\n"); goto err_match; } /* print result */ for (i = 0; i < size; i++) { si = match_buf[i].rm_so; ei = match_buf[i].rm_eo; if (si == -1 || ei == -1) { continue; } printf("%.*s\n", ei - si, &string[si]); } /* free resource */ err_match: free(match_buf); err_ptn: regfree(&ptn_buf); return 0; }

試したこと

・mingw-w64の新規インストール
・新規プロジェクトでコンソールアプリケーションを作成。
・c/c++->全般->追加のインクルードディレクトリ
C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\opt\include
・リンカー->全般->追加のライブラリーディレクトリ
C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\x86_64-w64-mingw32\lib
・リンカー->入力->追加の依存ファイル
libregex.a

mingw-w64の詳細です
C:>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=C:/Program\ Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-8.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/lib -L/c/mingw810/prerequisites/x86_64-zlib-static/lib -L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib '
Thread model: posix
gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)

よろしくお願いいたします。

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

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

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

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

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

SHOMI

2020/04/27 11:18

ソースコードは<code>をクリック(もしくは以下をコピペ)して ```ここに言語を入力 コード ``` の中に貼ってください。
nekotoinu

2020/04/27 11:48

ソースコードを修正しました。<code> ``` include <stdio.h> include <malloc.h> include <regex.h> int main(void) { char string[] = "abc, def, ghi"; const char regex[] = "([a-z]+), ([a-z]+), ([a-z]+)"; regex_t ptn_buf; regmatch_t* match_buf; size_t size; int si, ei; size_t i; /* compile */ if (regcomp(&ptn_buf, regex, REG_EXTENDED | REG_NEWLINE) != 0) { printf("regex compile failed\n"); return 1; } /* allocate match buffer */ size = ptn_buf.re_nsub + 1; match_buf = malloc(sizeof(regmatch_t) * size); if (match_buf == NULL) { printf("no memory\n"); goto err_ptn; } /* match */ if (regexec(&ptn_buf, string, size, match_buf, 0) != 0) { printf("no match\n"); goto err_match; } /* print result */ for (i = 0; i < size; i++) { si = match_buf[i].rm_so; ei = match_buf[i].rm_eo; if (si == -1 || ei == -1) { continue; } printf("%.*s\n", ei - si, &string[si]); } /* free resource */ err_match: free(match_buf); err_ptn: regfree(&ptn_buf); return 0; } ```
SHOMI

2020/04/27 11:56 編集

ここ(質問への追記・修正、ベストアンサー選択の依頼)ではなく、質問自体を編集してください。
nekotoinu

2020/04/27 13:50

質問自体だったんですね、失礼しました。 修正しました。 色々と助言などありがとうございました。
guest

回答1

0

ベストアンサー

VCのリンカはgcc/g++のオブジェクトファイルとは互換性がありません。
Makefileプロジェクトを作成してgcc/g++を使用してください。
Visual StudioでMinGWのgccを用いてコンパイル

VCでregex.hが使いたいだけなら、
onigurumaを入れて
onigposix.hregex.hにリネームするか、
#include<regex.h>#include<onigposix.h>に書き換えれば使えると思いますが…

投稿2020/04/25 11:56

編集2020/04/27 11:52
SHOMI

総合スコア4079

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

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

nekotoinu

2020/04/27 02:48

回答ありがとうございます。 おっしゃる通りvc2019のc言語でregex.hを使いたいだけです。 onigurumaのリンク先からファイルをダウンロードしてみたのですが コンパイル時に似たようなエラーが発生します。 行ったこと: Release 6.9.5 revised 1のダウンロードとc:\onigへ解凍 x64 Native Tools Command Prompt for VS 2019からコマンドプロンプト起動 c:\onigにbuildディレクトリ作成 c:\onig\build\make_win.batの実行 (c:\onigにonig.lib/onig_s.lib/onig.dll/onig.exp他objファイル多数が作成されました。) vcのプロジェクトの設定: c++->全般->追加のインクルードディレクトリ->c:\onig\src リンカ->全般->追加のライブラリーディレクトリ->c:\onig\build リンカー->入力->追加の依存ファイル->onig_s.lib;onig.lib #include <onigposix.h>と変更してコンパイルすると、 onigposix.hが見つかりませんとエラーがでます。 #include(c:\onig\src\onigposix.h>と入力すると 以下のエラーが発生します。 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー LNK2019 未解決の外部シンボル __imp_regcomp が関数 main で参照されました。 consoleapprications C:\Users\maru\source\repos\consoleapprications\filename.obj 1 設定やコンパイルパラメーターが間違っているのでしょうが、何が間違っているか教えてもらえないでしょうか。 よろしくお願いいたします。
SHOMI

2020/04/27 08:57

>#include <onigposix.h>と変更してコンパイルすると、 >onigposix.hが見つかりませんとエラーがでます。 パス設定が誤っているだけでしょう。 あなたが貼られたソースを#include <onigposix.h>に書き換えただけでこちらではコンパイルできました。 >リンカー->入力->追加の依存ファイル->onig_s.lib;onig.lib なぜスタティックリンク(onig_s.lib)とダイナミックリンク(onig.lib)の2つを同時に設定しているのですか。 onig.dlなしで動作させたいならonig_s.lib、onig.dllを使用するならonig.libです。 >エラー LNK2019 未解決の外部シンボル __imp_regcomp が関数 main で参照されました。 READMEに Win32でスタティックリンクライブラリ(onig_s.lib)をリンクする場合には、 コンパイルするときに -DONIG_EXTERN=extern をコンパイル引数に追加すること。 と書かれています。 c++->プリプロセッサの定義に書くなら「ONIG_EXTERN=extern」
nekotoinu

2020/04/27 11:42

SHOMIさんたびたび回答ありがとうございました。 コンパイルと実行ができました。 C言語の勉強を始めて間もなく、環境?も詳しくなく助かりました。 数日どうやるか不明で諦めかけてました。 本当ありがとうございます。 https://github.com/kkos/oniguruma/releases Source code(ZIP)をダウンロード c:\onigurumaへ解凍 スタート->visual studio 2019-> x64 Native Tools Command Prompt fVS 2019からコマンドプロンプト起動 c:\onigurumaにcd c:\onigurumaで移動 c:\oniguruma\make_win64.batを実行 (c:\onigurumaにonig.lib/onig_s.lib/onig.dll/onig.exp他objファイル多数が作成されました。) vcのプロジェクトの設定: すべての構成 プラットフォームx64 onig_slib使う場合 c++->全般->追加のインクルードディレクトリ->c:\oniguruma\src c++->コマンドライン->追加のオプション -DONIG_EXTERN=extern リンカ->全般->追加のライブラリーディレクトリ->c:\oniguruma リンカー->入力->追加の依存ファイル->onig_s.lib onig.libを使う場合 c++->全般->追加のインクルードディレクトリ->c:\oniguruma\src リンカ->全般->追加のライブラリーディレクトリ->c:\oniguruma リンカー->入力->追加の依存ファイル->onig.lib onig.dllをコンパイルした実行ファイルと同じディレクトリに保管かpathを通す
SHOMI

2020/04/27 11:54

言語学習とは直接関係のない環境固有のところで躓くと困ってしまいますよね。 RADMEやINSTALLといったファイル名で導入方法が書かれていることが多いので落ち着いて確認してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問