C++で作った関数をCから呼び出す

[戻る]
リノ 2001/11/06(火) 18:17:03
はじめまして。

VC++で作った関数をCのプログラムから呼び出したいので、
下のようなプログラムを組んでみました。


---source.h---
#ifdef __cplusplus
extern "C" {
#endif
int  Func(int);
#ifdef __cplusplus
}
#endif


---source.cpp---
#include  "source.h"

extern "C" int Func(int x)
{
return x%100;
}


---call.c---
#include <stdio.h>
#include "source.h"

int main(void)
{
printf("%d\n",Func(12345));
return 0;
}


これをLSIC86(試食版)でコンパイルしてみたらexeファイルはできるのですが、
関数をうまく呼び出せていません。
コンパイルしてみると

call.c6: Warning: function 'Func' undefined -- assumed to be int
lld @link.i
call.obj(call.c): Undefined symbol: Func_

とでます。
自分はすごく初心者なので、初歩的なミスをしているのかもしれませんが
どなたかここがおかしいというご指摘がありましたら
教えていただければ幸いです。
よろしくお願いします。

YuO [E-Mail] 2001/11/06(火) 19:19:54
VC++とLSI Cを混ぜることはできません。
#というか,別の会社のコンパイラを混ぜて使うことはできないと考えるべき。

リノ 2001/11/07(水) 11:37:00
あの、上の自分の書き込みで少し抜けてることがありました。
自分はVC++でDLLを作って、そのDLLの関数をCから呼び出したいんです。
それでもやっぱり無理なのでしょうか?

質問ばかりですみません。
自分の知識が足りないもので、自分のやろうとしていることが
うまく伝えることができていないかもしれません。

以前「C++で作った関数をCから呼び出す」ということができると
聞いたものですから、このやり方でできると思ったのですが・・・

どんなことでもいいので何かご指摘がありましたら
よろしくお願いします。

YuO [E-Mail] 2001/11/07(水) 12:04:27
>自分はVC++でDLLを作って、そのDLLの関数をCから呼び出したいんです。
このこと自体はできます。しかし,LSI-Cの試食版はMS-DOS用のコンパイラですから,呼び出すことはできません。
呼び出せるのは,Windowsの,作ったDLLに合わせたバージョンに対応したコンパイラを使った場合に限られます。

>?以前「C++で作った関数をCから呼び出す」ということができると
>聞いたものですから、このやり方でできると思ったのですが・・・
これもできます。ただし,同等の中間ファイルを生成する場合に限ります。

リノ 2001/11/07(水) 14:46:15
たびたび申し訳ないです。

>Windowsの,作ったDLLに合わせたバージョンに対応したコンパイラ
というのは、どういう意味なのでしょうか?
自分がDLLを作った環境で使えるコンパイラという事ですか?

YuO [E-Mail] 2001/11/07(水) 15:21:14
32bitのDLLを作ったのであれば32bit Windowsの実行ファイルが生成可能なコンパイラ,ということです。

32bitDLLを生成した場合,
・LSI-C試食版は32bit Windows上で使えますが,生成されるのはMS-DOS用のコードなので使えません。
・VC++ 1.0は32bit Windows上で使えますが,生成されるのは16bit Windows用のコードなので使えません。
・Borland C++ Compiler 5.5.1は32bit Windows上で使え,32bit Windows用のコードを生成するので使えます。
#全て同一CPUの話。

リノ 2001/11/07(水) 16:23:41
YuOさん何度も答えいただいてどうもありがとうございました。
とても詳しい説明でよくわかりました。

自分には根本的に知識が足りないのでもっと勉強してがんばろうと思います。
また質問することがあるかもしれませんが、その時はよろしくお願いします。

本当にありがとうございました。

古いスレッドには追加発言できません。