私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレCygwin + MinGW + GCC 相談室 Part 6
gcc スレッド一覧へ / gcc とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 :
レスフィルター : (試験中)
MinGW側でmallocしたポインタをVC++側でfreeしたり
FILE*を受け渡したりできるんでしょうか?
できないと思うんだけど、msvcrtを使っているというのはできるという意味でしょうか?
FILE*を受け渡したりできるんでしょうか?
できないと思うんだけど、msvcrtを使っているというのはできるという意味でしょうか?
ためだろ
解放用の関数なり自作スマポなりで対応しろ
クラスならコンストラクタデストラクタをprivateにしてstaticメソッドかfriendしてる関数からしか生成、破棄できないようにするのもあり
解放用の関数なり自作スマポなりで対応しろ
クラスならコンストラクタデストラクタをprivateにしてstaticメソッドかfriendしてる関数からしか生成、破棄できないようにするのもあり
どうもmsvcrtでも71や80など違いがあるらしく、そのあたりの問題らしい。
mallocしたポインタを返すからそっちでfreeしろって設計のライブラリを撲滅したい。
mallocしたポインタを返すからそっちでfreeしろって設計のライブラリを撲滅したい。
>>502
例えばMinGWのgccでコンパイルしたobjをMSVCのclでコンパイルしたobjにリンク
した場合は、可能だよ
(ただし、コンパイラサポート用の特殊なobjやlibを別途リンクする必要が
しばしば生じるし、C++の場合は両者のABIにそもそも互換性がないのでダメだ)
そうではなくて、MinGWで作ったDLLをMSVCで作ったexeから利用するシナリオを
考えているのなら、ダメ
MSVCに閉じた世界であっても、msvcrt.dll, msvcr70.dll, .... msvcr100.dllや
そのデバグ変種はすべて互換性がなく、exeとDLLが同じランタイムDLLを
利用しているのでない限り、そういうことは出来ない(それぞれ別のCランタイムを
ロードしてメモリに保持する形になる)
今のMSVCはデフォではmsvcrt.dllとリンクするようになっていないので
自動的にダメということになるよ
例えばMinGWのgccでコンパイルしたobjをMSVCのclでコンパイルしたobjにリンク
した場合は、可能だよ
(ただし、コンパイラサポート用の特殊なobjやlibを別途リンクする必要が
しばしば生じるし、C++の場合は両者のABIにそもそも互換性がないのでダメだ)
そうではなくて、MinGWで作ったDLLをMSVCで作ったexeから利用するシナリオを
考えているのなら、ダメ
MSVCに閉じた世界であっても、msvcrt.dll, msvcr70.dll, .... msvcr100.dllや
そのデバグ変種はすべて互換性がなく、exeとDLLが同じランタイムDLLを
利用しているのでない限り、そういうことは出来ない(それぞれ別のCランタイムを
ロードしてメモリに保持する形になる)
今のMSVCはデフォではmsvcrt.dllとリンクするようになっていないので
自動的にダメということになるよ
ちなみにC++が不要なら、MSVCでmsvcrt.dllとリンクするようにすることは一応可能
WDKを入れて、そちらのincludeとlibを使うといい
ただ色々落とし穴もあるし、事実上(少なくともモダンな)C++は使えない
ネットで検索すると色々情報が得られるはず
WDKを入れて、そちらのincludeとlibを使うといい
ただ色々落とし穴もあるし、事実上(少なくともモダンな)C++は使えない
ネットで検索すると色々情報が得られるはず
>>506
objも互換性があるのか。
DLLにしないとVC++側から使えないと思っていました。
ちなみにC++は不要でCだけでいいです。
>>507
逆にMinGW側でmsvcrt80などにリンクするようにビルドすることもできるらしいのですが
MSVC側のCRTのバージョンが上がっていきそうなので、
mallocしたポインタを返してこっちでfreeすることを要求してくるMinGW側のライブラリ(DLL)があって
僕が作っているわけではないオープンソースのライブラリなのでできればコードには触りたくないけど
MSVCから使いたい場合は、
MinGWのDLLをビルドしたのと同じバージョンのfreeを単体のDLLにしてその関数でfreeするのがいい方法でしょうか。
objも互換性があるのか。
DLLにしないとVC++側から使えないと思っていました。
ちなみにC++は不要でCだけでいいです。
>>507
逆にMinGW側でmsvcrt80などにリンクするようにビルドすることもできるらしいのですが
MSVC側のCRTのバージョンが上がっていきそうなので、
mallocしたポインタを返してこっちでfreeすることを要求してくるMinGW側のライブラリ(DLL)があって
僕が作っているわけではないオープンソースのライブラリなのでできればコードには触りたくないけど
MSVCから使いたい場合は、
MinGWのDLLをビルドしたのと同じバージョンのfreeを単体のDLLにしてその関数でfreeするのがいい方法でしょうか。
たぶんそれで大丈夫だけど、試したことはないな
そのオープンソースのライブラリが一応Windowsをサポートしているんなら
DLL boundaryを超えた場合の問題について開発者に説明して
libfoo_free()のような関数を入れてもらうのが本来は望ましいんじゃないの
objは互換性あるよ、少なくとも32bitでは
gccもwin32ターゲットの場合はCOFFを吐くし、fopenやmallocみたいな関数への
参照はどっちでコンパイルしたとしても最終的にリンク時に解決されるので
そのタイミングでリンクされるCランタイムが使われることになるわけだ
x64だとどうだったかな……x64のABIは確か結構ややこしいことになってるんだよな
そのオープンソースのライブラリが一応Windowsをサポートしているんなら
DLL boundaryを超えた場合の問題について開発者に説明して
libfoo_free()のような関数を入れてもらうのが本来は望ましいんじゃないの
objは互換性あるよ、少なくとも32bitでは
gccもwin32ターゲットの場合はCOFFを吐くし、fopenやmallocみたいな関数への
参照はどっちでコンパイルしたとしても最終的にリンク時に解決されるので
そのタイミングでリンクされるCランタイムが使われることになるわけだ
x64だとどうだったかな……x64のABIは確か結構ややこしいことになってるんだよな
LoadLibraryしてGetProcAddress(msvcrtdll, "free")では?
msvcrt.dllが(mingwによって)間接的にプロセスのメモリ空間にマップされているなら
LoadLibrary()の代わりにGetModuleHandle()でもいいね
LoadLibrary()の代わりにGetModuleHandle()でもいいね
この手の解決策はハックなので、ライブラリの実装を直してもらえるなら
直してもらったほうがいいのは間違いないわな
ライブラリがリソース解放用の関数を提供していれば、それがMinGWでビルド
されていようが、MSVCでビルドされていようが、問題ないわけで
直してもらったほうがいいのは間違いないわな
ライブラリがリソース解放用の関数を提供していれば、それがMinGWでビルド
されていようが、MSVCでビルドされていようが、問題ないわけで
個別に直してもらえれば一番いいのはそうですけど
いろいろあるのと今後もまたあるかもしれないので
相手の対応に依存せず自分側だけで対応できる汎用的な方法も持っておきたいというのがあるんですよね。
FILE*の受け渡しなんかはインターフェースの定義だから多分変えてもらえないので
同じバージョンのfopenが使いたいとかもあるし。
DLLと関数を指定して、それがインポートされているDLL名を取得して>>511ってのを試そうと思います。
いろいろあるのと今後もまたあるかもしれないので
相手の対応に依存せず自分側だけで対応できる汎用的な方法も持っておきたいというのがあるんですよね。
FILE*の受け渡しなんかはインターフェースの定義だから多分変えてもらえないので
同じバージョンのfopenが使いたいとかもあるし。
DLLと関数を指定して、それがインポートされているDLL名を取得して>>511ってのを試そうと思います。
http://bugs.ruby-lang.org/issues/3296
これとかまさに>>516なコードだよな
iconvとかどこでも使われてるのに、エラー通知がerrnoなために
DLL-safeでないってのが終わってる
POSIXだから今更インタフェース変えられるわけもねーし
これとかまさに>>516なコードだよな
iconvとかどこでも使われてるのに、エラー通知がerrnoなために
DLL-safeでないってのが終わってる
POSIXだから今更インタフェース変えられるわけもねーし
この手の問題ってメモリの処理はどうなってんだろ?
一つのプログラムが二つ以上の標準ライブラリとリンクしてしまった場合ヒープは適切に管理されるのかな
一つのプログラムが二つ以上の標準ライブラリとリンクしてしまった場合ヒープは適切に管理されるのかな
少なくとも今のCRTだとmalloc()は大して自分じゃ仕事してねーというか
HeapAlloc()に丸投げなので、CRTのバージョンが違ってもOSの側が
矛盾のないように仕事をしてくれるはず
ただし、それぞれがHeapCreate()で自分専用のプールみたいなもんをこしらえて、
そっからHeapAlloc()していく
OSの同じAPIに仕事させてる以上、それらは衝突はしないんだけれども
プールAから確保したメモリをプールBのものとして開放することはもちろんできない
HeapFree()の関数インタフェース見ればわかると思うけど
malloc()やfree()という関数インタフェースからはプールが見えないんだけど裏では
それぞれ専用のプールが使われるわけで、そこが要注意なわけだ
HeapAlloc()に丸投げなので、CRTのバージョンが違ってもOSの側が
矛盾のないように仕事をしてくれるはず
ただし、それぞれがHeapCreate()で自分専用のプールみたいなもんをこしらえて、
そっからHeapAlloc()していく
OSの同じAPIに仕事させてる以上、それらは衝突はしないんだけれども
プールAから確保したメモリをプールBのものとして開放することはもちろんできない
HeapFree()の関数インタフェース見ればわかると思うけど
malloc()やfree()という関数インタフェースからはプールが見えないんだけど裏では
それぞれ専用のプールが使われるわけで、そこが要注意なわけだ
なるほど。低レベルではHeapAllocを使っているならきっと拡張可能で作っていると思うんだが
2つヒープができてしまった場合効率的に使えるのかな?変に制限されるんじゃないかと思ったので
2つヒープができてしまった場合効率的に使えるのかな?変に制限されるんじゃないかと思ったので
標準ライブラリの数だけallocatorがあれば
ひとつより効率的ではないだろけど、まあそう気にするほどでもないのでは。
C++でもdeleteやdelete[]があって違うんじゃない。
ひとつより効率的ではないだろけど、まあそう気にするほどでもないのでは。
C++でもdeleteやdelete[]があって違うんじゃない。
gcc -pg で作って実行したらgmon.outができたけどgprof test.exe gmon.outとかやってもヘッダみたいなのしか出ない。なにか間違ってるのか?
tdm64-gcc-4.6.1をインストールして
gcc -o a.exe a.cpp
ってやると
undefined reference to 'operator new(unsigned long long)'
みたいなエラーがでるので解決策教えてください。
ソースは
int main(){
new int *a=new a;
}
です。
gcc -o a.exe a.cpp
ってやると
undefined reference to 'operator new(unsigned long long)'
みたいなエラーがでるので解決策教えてください。
ソースは
int main(){
new int *a=new a;
}
です。
すみません、よろしくお願がいします。
これはみんながなる症状なんでしょうか?
本当に困ってます。お願いします。
これはみんながなる症状なんでしょうか?
本当に困ってます。お願いします。
>>532
何故それを試さん
何故それを試さん
いま別のパソコンで試したけど同じ症状でした。
しかしg++にしたらちゃんとコンパイルとリンクできました。
有難うございます。
これは何が原因なんですか?
とても気になるのでおしえてください。
しかしg++にしたらちゃんとコンパイルとリンクできました。
有難うございます。
これは何が原因なんですか?
とても気になるのでおしえてください。
もしかしてgccはgnu c コンパイラーの略ってことですか?
gnuコンパイラーコレクションの略で好きな言語をコンパイル出来る
フロントエンドだと勝手に勘違いしてました。
大事なことをおしえてくれて有難うございます。
gnuコンパイラーコレクションの略で好きな言語をコンパイル出来る
フロントエンドだと勝手に勘違いしてました。
大事なことをおしえてくれて有難うございます。
mingw-get-instはインターネット回線に繋がってないパソコンではつかえないですよね?
ありがとうございます。
msysを手動でインストールする方法とか知ってますか?
知らないなら自分で考えます。
msysを手動でインストールする方法とか知ってますか?
知らないなら自分で考えます。
インストール出来る環境でインストールしたら、それを全部アーカイブしてよそへ持ってく。
例えばC:\MinGWにインストールしたらそのディレクトリごと。
コンソールへのショートカットはC:\MinGW\msys\1.0\msys.batを自前で作ればオッケー
だと思う。
時分の使い方の場合は問題でなかった。
あ、双方の環境でログイン名が違う場合は、ホームディレクトリをリネームするか
必要な設定ファイル群をコピーしてね。
例えばC:\MinGWにインストールしたらそのディレクトリごと。
コンソールへのショートカットはC:\MinGW\msys\1.0\msys.batを自前で作ればオッケー
だと思う。
時分の使い方の場合は問題でなかった。
あ、双方の環境でログイン名が違う場合は、ホームディレクトリをリネームするか
必要な設定ファイル群をコピーしてね。
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / gcc スレッド一覧へ
みんなの評価 : 類似してるかもしれないスレッド
- Cygwin + MinGW + GCC 相談室 Part 8 (938) - [97%] - 2022/10/28 8:00
- Cygwin + MinGW + GCC 相談室 Part 7 (996) - [97%] - 2014/9/21 2:15
- Cygwin + MinGW + GCC 相談室 Part 5 (981) - [97%] - 2011/4/6 2:32
- Cygwin + MinGW + GCC 相談室 Part 4 (1001) - [97%] - 2010/3/23 18:31 ☆
- Cygwin + MinGW + GCC 相談室 Part 3 (1001) - [97%] - 2008/9/12 0:04 ★
- 【激遅】AppleGCC【絶望】 (111) - [1%] - 2010/1/15 10:31
トップメニューへ / →のくす牧場書庫について