VC++ Expressで64bitコンパイルするための覚え書き [ソフトウェア/PC関係]
もうひとつ,Net::Twitterモジュール絡みのお話。
実は,クリーンなVMで試す前に,メインのWindows 7マシンでも,Net::Twitterモジュールのインストールを試してみていた。しかし,こちらも上手く行かず。といっても,状況はちょっと違う。Cのコードを含むモジュールをビルドする時に,ビット数が合わない,と怒られたのだ。この時まですっかり忘れていたが,メインのWindows 7は64bit。Active Perlも64bit版。でも,VC++ 2010 Expressは32bitコンパイラなのである。これでは,Perlのライブラリとリンクできるはずもない。
64bit用のモジュールをビルドするにはどうすればいいかというと,「Windows SDK 7.1」とやらをインストールすればいいらしい。この中に,64bitバージョンのコンパイラが含まれているのだ。ダウンロード先などは,こちらのブログに詳しい。...って,これは以前試したことがあって,メイン・マシンにはWindows SDKも既にインストールされている。しかし,だいぶ前のことなので,そのこと自体も,使い方も,すっかり忘れ去ってしまっていた。やっぱり,やったことはちゃんとまとめて,ここに書いておかないといけないと痛感。
で,どうやって64bitコンパイラを使うのか。Visual Studioでの設定は,前出のブログに書かれているが,私が使いたいのはコマンドラインのコンパイラ。VC++では,通常,"vsvars32.bat"といった名前で,PATHなど必要な環境変数を設定するバッチ・ファイルが用意されている。32bitじゃないのだから,"vsvars64.bat"? いやいや,なんかもっと違う名前で,生成するバイナリのタイプを引数で指定するんではなかったっけ? 全く思い出せないので,またまたWebを検索してみたところ,"vcvarsall.bat"という名前だと分かった。VC++ 2010 Expressのインストール・ディレクトリ(デフォルトは"C:\Program Files (x86)\Microsoft Visual Studio 10.0")の下の,VCディレクトリの中にある。これを,パスの通った別のディレクトリにコピーしてみたところ,ちゃんと動作しなかった。中でバッチ・ファイルのパスを参照してるらしい。しかたないので,元のディレクトリにPATHを通しておく。このバッチ・ファイルに,"amd64"というパラメータを付けて実行すると,64bitコンパイラを使える環境がセットアップされる。この状態で,もう一度Perlモジュールのビルドを試してみたところ,今度はなんの問題もなく成功した。
ところが,ビルドを続行していくと,今度はまた別のエラーが発生。"bufferoverflowU.lib"がない,というものだ。確かに,ディスクを検索してみても,そんなライブラリは見当たらない。なんで,そんなありもしないライブラリをリンクしようとするのだろう。
ここで再びGoogle検索。どうもこのライブラリは,コンパイラの「/GS」というオプションに関係があるようだ。元々は,このオプションを指定した時に必要になるライブラリだったのだが,コンパイラの仕様が変更になって,「/GS」オプションがデフォルトになったそうなのだ。「/GS-」というオプションを指定すると,キャンセルできるようなのだが,自分でコンパイラを呼び出している訳ではないので,どうやって「/GS-」を指定するのかが問題。
いろいろ調べた結果,環境変数CLにコンパイラ・オプションを設定しておくと,コンパイラ(cl.exe)はそれをデフォルトのオプションとして使ってくれるらしいことが分かった。実際に試してみたところ,確かに見には行っている。出鱈目なオプションをセットしておいたら,「そんなオプションは知らない」と怒られたので。ところが,CLに「/GS-」を設定しておいても,状況は変わらず。一体どうすれば? やはり,bufferoverflowU.libをなんとかして手に入れるしかないのだろうか。VC++の上位エディションを購入しないといけないというのでは,アウトである。
その後の調べで,幸い,bufferoverflowU.libは,Windows Driver Kit(WDK)に含まれていることが分かった。これをインストールすれば良いはず。私は,それだけのためにWDKをインストールするのが嫌だったので,ISOファイルをダウンロードして,中からそれらしいファイルを取り出した。具体的には,WDKディレクトリに"libs_x64fre_cab001.cab"というCABファイルがあって,その中の"_BufferOverflowU.lib_"で始まる名前のファイルがそれらしい。何故か3種類のファイルがあるが,違いは不明。取り敢えず1つ取り出してリネームし,モジュールのディレクトリに置いてみたら,ビルドが通るようになった。テストも通ったみたいだし,よく分かんないけど,まぁいいか。
以上のような紆余曲折を経て,メイン・マシンへのNet::Twitterモジュールのインストールは成功した。長い道程だったが,ひとまずめでたい。
実を言うと,bufferoverflowU.libの件も,以前やはり経験したことがあるような気がしてきている。記録に残しておくことは大事なことだと,つくづく感じた一件であった。
コメント 0