error LNK2028を解決するには?

解決


mi  2007-03-09 21:21:15  No: 64624  IP: 192.*.*.*

かなり基本的な質問で申し訳ありませんがよろしくお願いします。

フォームアプリケーションでプロジェクトを作成し、
そこからCで作られた関数を呼び出そうとすると
error LNK2028が発生してしまいます。
フォームアプリは/clrで作成してあり、(__clrcall)
Cの関数は/clrを使用せず__cdecl呼び出し規則になっています。
ということでLNK2028が出てると思うのですが

このエラーを解決する方法ってありますか?
よろしくお願いします。

編集 削除
mi  2007-03-09 21:25:49  No: 64625  IP: 192.*.*.*

すいません、環境がもれていました。
Visual Studio 2005 VC++を使用しています。

編集 削除
Blue  2007-03-09 21:52:23  No: 64626  IP: 192.*.*.*

>フォームアプリは/clrで作成
/clr:pure→/clr
と変更されたわけですよね?

>かなり基本的な質問
ではないかなぁと。
C++/CLIに関しては情報が少ないですから。

編集 削除
mi  2007-03-12 09:57:52  No: 64627  IP: 192.*.*.*

>/clr:pure→/clr
>と変更されたわけですよね?
そうです。

どうにか回避できないものでしょうか…

編集 削除
Blue  2007-03-12 10:07:50  No: 64628  IP: 192.*.*.*

もしできないのであれば、DllImportを使うしかないですかね。
(CallingConvention=CallingConvention.Cdeclを指定)

この場合文字列を扱うときすこし工夫する必要がありますけど。

編集 削除
mi  2007-03-12 10:35:44  No: 64629  IP: 192.*.*.*

すいません、
>もしできないのであれば、DllImportを使うしかないですかね。
>(CallingConvention=CallingConvention.Cdeclを指定)
検索してみたのですが、使い方が理解できませんでした。

どのように使用すればいいのでしょうか?

編集 削除
kure  2007-03-12 10:42:10  No: 64630  IP: 192.*.*.*

/clrなら__cdeclの関数を普通に使えるはずです。
手元のVC2005EEで試してみても特に問題なくビルドできますよ。

LNK2028は単に未解決のシンボル参照があるというエラーなので
リンク設定がされていないだけなのではないですか?

# ヘルプの先頭あたりにいきなり
# 「ネイティブ関数を純粋なイメージにインポートしようとするときは、
# ネイティブ コンパイルと純粋なコンパイルで
# 暗黙の呼び出し規約が異なることに注意してください。」
# って書かれてるのを鵜呑みにしていませんか?

なんのための/clrなのかとかをきちっと理解したほうが良いと思いますよ

編集 削除
Blue  2007-03-12 10:44:25  No: 64631  IP: 192.*.*.*

肝心の関数の引数とかわかんないので適当になってしまいますけど。

[DllImport("XXXXX.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static int add(int x, int y);

こんなかんじ。

編集 削除
Blue  2007-03-12 10:47:36  No: 64632  IP: 192.*.*.*

>/clrなら__cdeclの関数を普通に使えるはずです。
やっぱりそうですよね。

>鵜呑みにしていませんか?
鵜呑みにしてしまいました。orz
(まさか、〜.libをリンクしていない落ちだと思わなかったわけで。)

編集 削除
mi  2007-03-12 10:56:50  No: 64633  IP: 192.*.*.*

使えました。
勉強不足を痛感しました。ありがとうございます。

編集 削除
Blue  2007-03-12 11:02:51  No: 64634  IP: 192.*.*.*

>使えました。
とは?
〜.libをリンクしたということ?

C++/CLIでもDllImportを使うのはかなりアブノーマルです。
〜.libファイルがないという理由で使うのはないかと。
(ないならLoadLibrary&GetProcAddressをつかう)

編集 削除
Blue  2007-03-12 11:04:39  No: 64635  IP: 192.*.*.*

あれ
>C++/CLIでもDllImportを使うのはかなりアブノーマルです。
やっぱありかなぁ。。
LoadLibrary&GetProcAddressを使うよりも扱いやすいか。

編集 削除
mi  2007-03-12 11:11:30  No: 64636  IP: 192.*.*.*

>〜.libをリンクしたということ?
リンクしたところ動きました。
すいません、つまらない落ちでした

編集 削除