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

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

ただいまの
回答率

90.52%

  • C#

    7111questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    3687questions

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

  • C++

    3450questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1832questions

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

dllimportでcのdll内の関数を呼び出す(gccコンパイラとvisual studio)

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,307

KTMEI

score 36

以下のような事はできるのでしょうか。

① cのソースをgccでコンパイルしDLLを作成
② Visual StudioのC#から「①」のDLLインポート

試しに簡単なソースで試してみたらできなかったので、
やり方が悪いのかそもそもコンパイラが違うから
出来ないものなのかを知りたいです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

cygwinのgccでDLLを作ることはできます。詳細はcygwinのマニュアルの「Building and Using DLL」を参照下さい。なおそこに書いてありますが、cygwinで作ったDLLは「cyg」が頭についた名前になります。dllimportでインポートするときはこの名前を指定する必要があります。

また、dllimportで動的にインポートするのではなく、コンパイル・リンク時に使うDLLを指定しておく場合、そのDLLのインポートライブラリが必要です。cygwinでDLLを作ったときにできるインポートライブラリ (名前の頭に「lib」がつき、拡張子が「.a」) は、VC++でのインポートライブラリ (拡張子が「.lib」) としては使えません。このような場合は、.defファイルを作成してそれをもとにインポートライブラリを生成する必要があると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/02 10:05

    ご回答ありがとうございます。

    頂いたcygwinのサイトを確認しました。

    以下のようにソースコードを作成して実験してみたのですが、
    MinGWのgccを使用した場合、下記のコードの箇所で変数aに
    int の 6 が入ってきました。

    var a = helloFunc();

    しかし、Cygwinのgccを使用した場合、上記のコードのところで
    いきなり落ちてしまいます。

    cygの接頭辞がつくとおっしゃっていましたが、cygwinの
    サイトには静的にライブラリとして呼び込む場合にcygの接頭辞が
    必要なように見えます。これは動的にDLLを呼び出す際にも
    必要なのでしょうか?
    (試しにDLLの名前の先頭にcygをつけてみましたが、同じように
     落ちてしまいました・・。)

    cygwinのgccでコンパイルしたDLLを動的に読み込むのに何か他に
    必要な作業、足りていない作業が有りましたらご教授ください。

    以下サンプルプログラムです。
    ```C#
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace GCCTest
    {
    public partial class Form1 : Form
    {
    //[DllImport("helloForMinGW.dll", CallingConvention = CallingConvention.Cdecl)]
    //static extern unsafe int helloMethod();

    [DllImport("cyghelloForCygwin.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern unsafe int helloMethod();

    // delegate of c function
    unsafe delegate int DelegateHelloFunc();

    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    unsafe
    {
    try
    {
    DelegateHelloFunc helloFunc = (DelegateHelloFunc)helloMethod;
    var a = helloFunc();
    }
    catch (Exception)
    {

    }
    }
    }
    }
    }
    ```

    ```C
    hello.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    __declspec(dllexport) long helloMethod();

    long helloMethod()
    {
    return 6;
    }
    ```

    ■MinGWのgccでコンパイルしたコマンド

    gcc -c hello.c -o helloForMinGWgcc.o
    gcc -shared -o helloForMinGW.dll helloForMinGWgcc.o

    ■cygwinのgccでコンパイルしたコマンド
    gcc -c hello.c -o helloForCygwingcc.o
    gcc -shared -o helloForCygwin.dll helloForCygwingcc.o


    キャンセル

  • 2017/02/02 11:23

    - エラーメッセージなどは表示されていませんか。
    - また、cygwinのgccでコンパイル・リンクしたものは実行時にcygwin1.dllが必要ですが、パスは通っているでしょうか。

    なお、当方は今すぐに試せる環境がないのですが、デバッグビルドしてデバッガでトレース実行してみると、詳しいことがわかるかもしれません。

    キャンセル

  • 2017/02/02 13:18

    本コメント投稿時は、エラーもなく落ちていました。
    先程試したところ、「vshost.exeは動作を停止しました」の
    ポップアップが出て、落ちてしまいます。

    ポップアップの際に出てくるログの内容(問題の詳細の表示)は
    以下のようになっています。

    問題の署名:
    問題イベント名: APPCRASH
    アプリケーション名: GCCTest.vshost.exe
    アプリケーションのバージョン: 12.0.30723.0
    アプリケーションのタイムスタンプ: 53cf4fe5
    障害モジュールの名前: clr.dll
    障害モジュールのバージョン: 4.6.1087.0
    障害モジュールのタイムスタンプ: 583e5e56
    例外コード: c0000005
    例外オフセット: 00000000005b57bc
    OS バージョン: 6.1.7601.2.1.0.256.48
    ロケール ID: 1041
    追加情報 1: e8ee
    追加情報 2: e8eeef281cb8a34cc1d7843a0b67867f
    追加情報 3: 684e
    追加情報 4: 684ef898f8eb5bca866c395e2cb44902

    オンラインのプライバシーに関する声明をお読みください:
    http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0411

    オンラインのプライバシーに関する声明が利用できない場合は、プライバシーに関する声明をオフラインでお読みください:
    C:\Windows\system32\ja-JP\erofflps.txt

    尚、「cygwin1.dllのパスは通っているか」ですが、
    環境変数のpathにcygwin1.dllのパスを入れていて、
    gccのコマンドを打つと、環境変数のpath配下のgccが
    実行されているので、問題ないと考えています。

    キャンセル

  • 2017/02/02 13:52

    うーん、ちょっと原因がわからないです。
    - VC++で、ホスト プロセスを作成しないようにして再コンパイルして試してみては。
    https://msdn.microsoft.com/ja-jp/library/ms185330.aspx

    今のところ、これくらいしか思いつきません。

    キャンセル

  • 2017/02/15 09:36

    こちらを実施してみましたが、やはりcygwinのgccでコンパイルした場合はインポートが出来ませんでした。
    MinGWのgccでは問題なくインポート出来ているので、インポートの実装自体は問題ないと思うのですが・・・。

    キャンセル

  • 2017/02/15 18:03

    あと、32ビット版と64ビット版でやっているということはないですよね。それだったらそもそも動かない気もしますが。

    キャンセル

  • 2017/02/16 08:44

    gccのコンパイラはx64を使用し、C#側もx64です。
    以下のgccを試しました。後者がx64のgccと認識しています。
    ---
    gcc.exe
    x86_64-pc-cygwin-gcc-6.3.0.exe

    ダウングレードとかすると出来る可能性ってあるんでしょうか・・・。
    (バージョン固有の不具合とか・・?)

    キャンセル

0

こんにちは。

実際にやったことはないのですが、gccがMinGWの意味でしたら原理的には出来るはずですよ。
Windows APIもC言語I/Fのdllです。それをC#から呼び出せます。それと同じです。

gccがlinuxやunix、cygwin上のものでしたら、原理的にできないと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/01 16:04

    回答ありがとうございます。

    変な質問の仕方になっているかもしれないのですが・・・

    Cソース自体はLinux上のgccでコンパイルして使っていました。
    このソースをWindows上にファイルを持ってきてCygwinのGCCで
    コンパイルして内部の関数を使えないかと考えていました。

    つまり、cygwin上のgccだと、結局はUnixのgccを実行している為、
    Linux用のモジュールが出来上がることになり、Windows上では
    実行できないという認識でいいのでしょうか。

    MinGWのGCCであれば、Windowsのコンパイラとして動作するため、
    C#から呼び出すことが出来るという認識でいいでしょうか。

    キャンセル

  • 2017/02/01 17:01

    > cygwin上のgccだと、結局はUnixのgccを実行している為、
    > Linux用のモジュールが出来上がることになり、Windows上では
    > 実行できないという認識でいいのでしょうか。

    調べてみまたところcygwinについて理解不足してました。すいません。
    cygwinの場合、linux用モジュールができるわけではなくWindows用のモジュールのようです。
    ならば、ロードはできるのでC#とリンクできるかどうかが問題です。通常のC言語I/FであればC#からも呼べるはずですので、まずは普通にMinGWがらcygwinのdllを呼び出せるかどうかやってみては如何でしょうか?

    > MinGWのGCCであれば、Windowsのコンパイラとして動作するため、
    > C#から呼び出すことが出来るという認識でいいでしょうか。

    その通りです。

    キャンセル

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

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

関連した質問

  • 受付中

    exeとdllの作成に関して

    VisualStudioを利用してビルドすると、exeもしくはdllが生成されると思います。 しかしながら、両者はどういった事由で作り分けられているのでしょうか。 Main関数

  • 解決済

    C++でのクラスのメンバ関数が占める容量が知りたい

    C++で大量のクラスの配列を使わなくてはならないのですが、メモリをどれくらい食うのかが気になりました。 sizeof()で調べてみたのですが、50行ほどの関数のみのクラスが1Byt

  • 解決済

    ツールボックスにPlotを追加したい

    毎度お世話になっております。 私は今ツールボックスにPlotを追加できないことに悩んでおります。 http://whoopsidaisies.hatenablog.com/

  • 解決済

    納品物の「ソースファイル一式」とは何を指すのか

    Visual Studioで、Webアプリケーションを制作しております。 クライアントへの納品物一覧に「ソースファイル一式」が含まれているのですが、 一般的に「ソースフ

  • 受付中

    VS2015/2017でVS2013ランタイムを使うようなDLLを作りたい

    概要 C++について、コンパイラはVisual Studio 2015またはVisual Stuido 2017を使いたいのですが、最終的できるDLLはVisual Studio

  • 受付中

    Visual Studioでの実行のエラーについて

    Visual StudioでC++プログラムをコンパイルし、実行をしようとした際、 ハンドルされない例外が 0x000000013FA73B9D (プロジェクト名.exe) で

  • 解決済

    c#でガーバーフォーマット表示

    ガーバーフォーマットRS-274Xをformに表示させたいです。 いい感じの関数ありませんか。 ガーバーフォーマットRS-274Xの中を理解して自力で一つずつ作るしか方法はない

  • 解決済

    Visual Studio の使用について

    Visual Studio でc言語を始めたのですがおなじソースファイルに複数のファイルを作成したら既に ~.objで定義されていると出て、またmain関数など関数の多重定義のせい

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

  • C#

    7111questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    3687questions

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

  • C++

    3450questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1832questions

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