のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,836人
昨日:no data人
今日:
最近の注目
人気の最安値情報

    私的良スレ書庫

    不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
    ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

    元スレCygwin + MinGW + GCC 相談室 Part 6

    gcc スレッド一覧へ / gcc とは? / 携帯版 / dat(gz)で取得 / トップメニュー
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    レスフィルター : (試験中)
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
    501 : デフォルトの名無 - 2012/01/28(土) 17:44:11.08 (+8,+29,+0)
    >>500
    よく見たら、書いてありました。すいません。
    http://toro.2ch.net/test/read.cgi/unix/1268282846/14
    502 : デフォルトの名無 - 2012/02/01(水) 10:41:28.34 (+29,-30,-21)
    MinGW側でmallocしたポインタをVC++側でfreeしたり
    FILE*を受け渡したりできるんでしょうか?
    できないと思うんだけど、msvcrtを使っているというのはできるという意味でしょうか?
    503 : デフォルトの名無 - 2012/02/01(水) 11:14:22.99 (+7,-29,-49)
    ためだろ
    解放用の関数なり自作スマポなりで対応しろ
    クラスならコンストラクタデストラクタをprivateにしてstaticメソッドかfriendしてる関数からしか生成、破棄できないようにするのもあり
    504 : 502 - 2012/02/01(水) 11:27:47.34 (-1,-29,-45)
    どうもmsvcrtでも71や80など違いがあるらしく、そのあたりの問題らしい。
    mallocしたポインタを返すからそっちでfreeしろって設計のライブラリを撲滅したい。
    505 : デフォルトの名無 - 2012/02/01(水) 11:29:19.63 (-1,-29,-20)
    >>503
    mingwfreeというmingw側の関数でfreeするだけの関数が入ったDLLを作って対応していたんだけど
    本当にこれ必要なのかなって疑問でした。
    506 : デフォルトの名無 - 2012/02/01(水) 11:41:07.39 (+22,-30,-222)
    >>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とリンクするようになっていないので
    自動的にダメということになるよ
    507 : 506 - 2012/02/01(水) 11:43:03.46 (+10,-30,-73)
    ちなみにC++が不要なら、MSVCでmsvcrt.dllとリンクするようにすることは一応可能
    WDKを入れて、そちらのincludeとlibを使うといい
    ただ色々落とし穴もあるし、事実上(少なくともモダンな)C++は使えない
    ネットで検索すると色々情報が得られるはず
    508 : 502 - 2012/02/01(水) 12:13:51.23 (+5,-30,-125)
    >>506
    objも互換性があるのか。
    DLLにしないとVC++側から使えないと思っていました。
    ちなみにC++は不要でCだけでいいです。
    >>507
    逆にMinGW側でmsvcrt80などにリンクするようにビルドすることもできるらしいのですが
    MSVC側のCRTのバージョンが上がっていきそうなので、
    mallocしたポインタを返してこっちでfreeすることを要求してくるMinGW側のライブラリ(DLL)があって
    僕が作っているわけではないオープンソースのライブラリなのでできればコードには触りたくないけど
    MSVCから使いたい場合は、
    MinGWのDLLをビルドしたのと同じバージョンのfreeを単体のDLLにしてその関数でfreeするのがいい方法でしょうか。
    509 : デフォルトの名無 - 2012/02/01(水) 13:17:19.87 (+36,-30,-145)
    たぶんそれで大丈夫だけど、試したことはないな

    そのオープンソースのライブラリが一応Windowsをサポートしているんなら
    DLL boundaryを超えた場合の問題について開発者に説明して
    libfoo_free()のような関数を入れてもらうのが本来は望ましいんじゃないの

    objは互換性あるよ、少なくとも32bitでは
    gccもwin32ターゲットの場合はCOFFを吐くし、fopenやmallocみたいな関数への
    参照はどっちでコンパイルしたとしても最終的にリンク時に解決されるので
    そのタイミングでリンクされるCランタイムが使われることになるわけだ

    x64だとどうだったかな……x64のABIは確か結構ややこしいことになってるんだよな
    510 : デフォルトの名無 - 2012/02/01(水) 16:32:47.61 (+62,+29,-7)
    >>509
    今そうしているので動いてはいるんだけど
    もっと普通の方法がないのかなと思ったのです。
    どうもです。
    511 : デフォルトの名無 - 2012/02/01(水) 16:49:08.70 (+38,-30,-14)
    LoadLibraryしてGetProcAddress(msvcrtdll, "free")では?
    512 : デフォルトの名無 - 2012/02/01(水) 17:37:53.09 (-2,-30,-44)
    msvcrt.dllが(mingwによって)間接的にプロセスのメモリ空間にマップされているなら
    LoadLibrary()の代わりにGetModuleHandle()でもいいね
    513 : デフォルトの名無 - 2012/02/01(水) 17:54:09.97 (-1,-29,-4)
    >>511
    そっちのほうが簡単ですね
    MinGWがmsvcrt.dllを使っているというのは期待してていいんでしょうか
    514 : デフォルトの名無 - 2012/02/01(水) 17:56:55.89 (+34,-27,-17)
    DLLが使っているfreeのアドレスをなんらか判定して取れれば一番いい気がしますけど
    515 : デフォルトの名無 - 2012/02/01(水) 17:58:28.73 (+62,+29,-39)
    この手の解決策はハックなので、ライブラリの実装を直してもらえるなら
    直してもらったほうがいいのは間違いないわな
    ライブラリがリソース解放用の関数を提供していれば、それがMinGWでビルド
    されていようが、MSVCでビルドされていようが、問題ないわけで
    516 : デフォルトの名無 - 2012/02/01(水) 17:59:49.32 (+69,+29,-37)
    >>514
    そのDLLのインポートセクションを見れば一応わかるはず
    APIフックなどでは使われる手法だけど、ハックだな
    517 : デフォルトの名無 - 2012/02/01(水) 18:02:10.74 (-1,-29,-1)
    msvcrt.dll使ってるとは限らないしなぁ
    518 : デフォルトの名無 - 2012/02/01(水) 18:39:45.66 (+68,+29,-68)
    個別に直してもらえれば一番いいのはそうですけど
    いろいろあるのと今後もまたあるかもしれないので
    相手の対応に依存せず自分側だけで対応できる汎用的な方法も持っておきたいというのがあるんですよね。
    FILE*の受け渡しなんかはインターフェースの定義だから多分変えてもらえないので
    同じバージョンのfopenが使いたいとかもあるし。

    DLLと関数を指定して、それがインポートされているDLL名を取得して>>511ってのを試そうと思います。
    519 : デフォルトの名無 - 2012/02/07(火) 01:56:10.50 (+12,-29,-16)
    http://bugs.ruby-lang.org/issues/3296
    これとかまさに>>516なコードだよな

    iconvとかどこでも使われてるのに、エラー通知がerrnoなために
    DLL-safeでないってのが終わってる
    POSIXだから今更インタフェース変えられるわけもねーし
    520 : デフォルトの名無 - 2012/02/12(日) 00:42:21.69 (+57,+29,-52)
    この手の問題ってメモリの処理はどうなってんだろ?
    一つのプログラムが二つ以上の標準ライブラリとリンクしてしまった場合ヒープは適切に管理されるのかな
    521 : デフォルトの名無 - 2012/02/12(日) 01:32:29.29 (+3,-29,-143)
    少なくとも今のCRTだとmalloc()は大して自分じゃ仕事してねーというか
    HeapAlloc()に丸投げなので、CRTのバージョンが違ってもOSの側が
    矛盾のないように仕事をしてくれるはず
    ただし、それぞれがHeapCreate()で自分専用のプールみたいなもんをこしらえて、
    そっからHeapAlloc()していく

    OSの同じAPIに仕事させてる以上、それらは衝突はしないんだけれども
    プールAから確保したメモリをプールBのものとして開放することはもちろんできない
    HeapFree()の関数インタフェース見ればわかると思うけど

    malloc()やfree()という関数インタフェースからはプールが見えないんだけど裏では
    それぞれ専用のプールが使われるわけで、そこが要注意なわけだ
    522 : デフォルトの名無 - 2012/02/12(日) 01:58:28.91 (+57,+29,-31)
    なるほど。低レベルではHeapAllocを使っているならきっと拡張可能で作っていると思うんだが
    2つヒープができてしまった場合効率的に使えるのかな?変に制限されるんじゃないかと思ったので
    523 : デフォルトの名無 - 2012/02/12(日) 03:45:52.29 (-1,-29,-44)
    標準ライブラリの数だけallocatorがあれば
    ひとつより効率的ではないだろけど、まあそう気にするほどでもないのでは。
    C++でもdeleteやdelete[]があって違うんじゃない。
    524 : デフォルトの名無 - 2012/02/14(火) 12:21:53.07 (-1,-29,-21)
    mingwのgprofはlinuxのとくらべて制限とかありますか?
    525 : デフォルトの名無 - 2012/02/14(火) 12:36:18.05 (+57,+29,+0)
    ありがとうございます。
    あるとわかってよかったです。
    526 : デフォルトの名無 - 2012/02/14(火) 23:42:58.64 (-6,-29,-7)
    gprofって、凄いの?
    527 : デフォルトの名無 - 2012/02/15(水) 12:49:16.99 (-1,-29,-18)
    gcc -pg で作って実行したらgmon.outができたけどgprof test.exe gmon.outとかやってもヘッダみたいなのしか出ない。なにか間違ってるのか?
    528 : デフォルトの名無 - 2012/02/15(水) 13:35:45.56 (+48,+30,+0)
    529 : デフォルトの名無 - 2012/02/16(木) 15:29:10.20 (+3,-30,-86)
    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;
    }
    です。
    530 : デフォルトの名無 - 2012/02/16(木) 15:48:02.62 (-1,-29,-3)
    訂正
    ソースは
    int main(){
    int *a = new int;
    です。
    531 : デフォルトの名無 - 2012/02/16(木) 16:00:03.50 (+4,-13,+0)
    g++
    532 : デフォルトの名無 - 2012/02/16(木) 16:06:36.96 (+29,-29,-2)
    gccをg++に変えればできるんですか?
    533 : デフォルトの名無 - 2012/02/16(木) 16:10:54.70 (+57,+29,-8)
    すみません、よろしくお願がいします。
    これはみんながなる症状なんでしょうか?
    本当に困ってます。お願いします。
    534 : デフォルトの名無 - 2012/02/16(木) 16:46:04.85 (+56,+29,+0)
    >>532
    何故それを試さん
    535 : デフォルトの名無 - 2012/02/16(木) 16:53:19.78 (+57,+29,-3)
    すみません、インストールしたパソコンではないので
    今すぐ出来ません。
    許してください。
    536 : デフォルトの名無 - 2012/02/16(木) 17:04:55.28 (+57,+29,-6)
    じゃあ、試してから結果を報告してください
    それまでお待ちしています
    537 : デフォルトの名無 - 2012/02/16(木) 17:34:33.60 (+57,+29,-17)
    はい、また何日か後くらいにきます。
    そのときはよろしくお願いします。
    538 : デフォルトの名無 - 2012/02/16(木) 17:51:57.66 (+57,+29,-21)
    いま別のパソコンで試したけど同じ症状でした。
    しかしg++にしたらちゃんとコンパイルとリンクできました。
    有難うございます。
    これは何が原因なんですか?
    とても気になるのでおしえてください。
    539 : デフォルトの名無 - 2012/02/16(木) 18:43:21.54 (+57,+29,-20)
    え、今時の学生は基本的なことも知らないでやるの?
    540 : デフォルトの名無 - 2012/02/16(木) 18:46:25.61 (+106,+29,-49)
    もしかしてgccはgnu c コンパイラーの略ってことですか?
    gnuコンパイラーコレクションの略で好きな言語をコンパイル出来る
    フロントエンドだと勝手に勘違いしてました。
    大事なことをおしえてくれて有難うございます。
    541 : デフォルトの名無 - 2012/02/16(木) 20:19:11.22 (+69,+28,-21)
    >>540
    コンパイルは出来るよ。
    言語ごとのライブラリを勝手にリンクしないだけ
    542 : デフォルトの名無 - 2012/02/16(木) 20:33:57.27 (-6,-29,+0)
    -v 見ると楽しいよな
    543 : デフォルトの名無 - 2012/02/17(金) 01:38:57.98 (+57,+29,-5)
    なんでもはコンパイルできないわよ。知ってる言語だけ。
    544 : デフォルトの名無 - 2012/02/20(月) 16:22:39.59 (+2,-25,-2)
    じゃあ539の勘違いということでFAですね。
    545 : デフォルトの名無 - 2012/02/20(月) 16:53:58.45 (-1,-29,-10)
    エラー: ‘new’ が宣言されていません (この関数内での最初の使用)
    546 : デフォルトの名無 - 2012/02/22(水) 13:25:24.33 (-1,-29,-9)
    mingw-get-instはインターネット回線に繋がってないパソコンではつかえないですよね?
    547 : デフォルトの名無 - 2012/02/22(水) 14:07:28.95 (+45,+27,+0)
    つかえないです
    548 : デフォルトの名無 - 2012/02/25(土) 08:48:41.26 (+91,+14,-10)
    ありがとうございます。
    msysを手動でインストールする方法とか知ってますか?
    知らないなら自分で考えます。
    549 : デフォルトの名無 - 2012/02/25(土) 10:14:42.41 (+3,-30,-75)
    インストール出来る環境でインストールしたら、それを全部アーカイブしてよそへ持ってく。
    例えばC:\MinGWにインストールしたらそのディレクトリごと。
    コンソールへのショートカットはC:\MinGW\msys\1.0\msys.batを自前で作ればオッケー
    だと思う。
    時分の使い方の場合は問題でなかった。

    あ、双方の環境でログイン名が違う場合は、ホームディレクトリをリネームするか
    必要な設定ファイル群をコピーしてね。
    550 : デフォルトの名無 - 2012/02/25(土) 11:14:27.76 (+46,+18,+1)
    ありがとうございます。
    参考にします。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / gcc スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

    類似してるかもしれないスレッド


    トップメニューへ / →のくす牧場書庫について