HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0713
にゃんちゃんHSPとC++の同時利用5解決


にゃんちゃん

リンク

2017/7/13(Thu) 23:16:14|NO.80574

こんにちは。またまたかなり特殊な話題なのですが、ご教示いただければ幸いです。
今まで、hspでちょっと足りないとか、早くしたい処理をC言語でdllとして書いていましたが、やっぱりC++に移りたいと思いました。まず、dllの実装的にこれが可能かどうか私には分からないのですが、なんかできそうな気がするので、とりあえず以下のコードを書いてみました。
ですが、以下のプログラムを実行すると、なぜかスクリプトエディタとランタイムが両方とも固まってしまいます。もっと単純な関数(C++の機能を使わない関数(の時にはできていたのですが、この原因は何でしょうか?
C言語は1年ぐらい使っていますが、C++は10分ぐらいですごめんなさい。
今はもう出ないのですが、固まるようになるまえ、一瞬「エントリポイントがない」みたいなエラーがでて、そのときは関数名がデコレーションされていました。ですが、Cで書いてたときは dllMain がなくても動いてたし、最初の return param*2; だけの関数では問題なかったし、extern "C" でデコレーションは消してるし、このへんが分かりません。

a.cpp (g++ -shared a.cpp)

#include <string.h> #include <iostream> #include <vector> #include <string> using namespace std; #define dll extern "C" __declspec(dllexport) vector<string> lst; dll int list_add(char* in){ string add=in; lst.push_back(add); return 1; } dll void list_show(char* out){//こっちの関数はまだ使ってない size_t i; for(i=0;i<lst.size()-1;i++){ strcat(out,lst[i].c_str()); } }
a.hsp

#uselib "a.dll" #func list_add "list_add" sptr #func list_show "list_show" int list_add "This " list_add "is " list_add "a " list_add "test." //このあとにshowしようと思ったんだけどその前にだめだった end

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



この記事に返信する


にゃんちゃん

リンク

2017/7/13(Thu) 23:41:13|NO.80575

あ、エラー出ました。
プロシージャ エントリ ポイント _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv がダイナミック リンク ライブラリ libstdc++-6.dll から見つかりませんでした。
---------------------------
OK
---------------------------



Velgail

リンク

2017/7/14(Fri) 01:41:52|NO.80576

ひとまず参考資料として、私が安定的に使っているこれを
http://hsp.tv/play/pforum.php?mode=pastwch&num=22578



rop

リンク

2017/7/14(Fri) 07:19:36|NO.80578

エラー文をそのまま解釈すればランタイムDLLに必要な命令が見つからないってことでしょう。
libstdc++-6.dllで検索すればいろいろ出てきます。
この辺とか参考になりそうです。

https://teratail.com/questions/70590



MillkeySoftw

リンク

2017/7/14(Fri) 13:37:11|NO.80581

DLLの作成の参考になればとサンプルプロジェクトを作ってみた。
下記からダウンロードしてね。

http://hspsource.wiki.fc2.com/wiki/DLLサンプル
↑の一行すべてが URL です。日本語になるとURLが途切れる・・・

注意 : C++ 側の一部関数を修正しています。strcat → strcat_s



にゃんちゃん

リンク

2017/7/14(Fri) 19:07:52|NO.80589

みなさん、ありがとうございます。解決しました。参考資料とgoogle先生にお世話になって色々分かりました。
HSP関連の問題なのかと思ってたら、普通にみんなはまる類のやつだったんですね。一応今後のために、分かったことをまとめておきます。
-----
VSを使うんだったら、ここから下は気にする必要なし。普通にDLLのプロジェクト作ってしかるべき設定してればできる。Fさんの記事とMillkeySoftwさんのサンプルプロジェクトまであってできないわけがない。
CUIが好きすぎるから、あえてそれでもMinGW G++を使ってやりたいとかいう私みたいな人は、さっさと-static-libstdc++ オプションを付けるべし。以上スピード解決。
出力ファイルのサイズがでかくなっていやだったら、とりあえずVSでやっとこう。私はサイズよりCUIを取る。
原因は、標準ランタイムファイル libstdc++-6.dll がg++の想定してるもののほかにもいっぱい種類があるらしいこと。想定外のランタイムを読んで実行しようとしたので昨日みたいになった。なので、スタティックリンクしてくっつけてしまえば問題ない。
バージョン違いをなくせばそれはそれで動くんだろうけど、配布することなどを考えたらめんどくさそうなので、やっぱりスタティックリンクで。
-----



ONION software Copyright 1997-2023(c) All rights reserved.