Visual Studio 2017でlibcurlを使おうとして、libcurlのソースからビルドして動かした。
Google MapsのGeolocation APIを叩くために、curlコマンドから動かす代わりに、libcurlというライブラリを使って自分で書いたプログラムの中からAPIを使うというのをやりたい。
というか、前に既にやってた。
しかしVisual Studio 2017だと古いlibcurlをリンクできなくてエラーになってしまう。最新のlibcurlを使う必要があるようだ。
公式で配布されてるWindows版バイナリはMingw用で、拡張子が.aになっている。
強引に.libにリネームすればリンクできるはずだったが、やってみるとリンクエラーが出る。
結局その配布されているWindows版バイナリはうまくリンクできないので、ソースコードからVisual Studio 2017でビルドしてみた。
しかし、どうもうまくいかない。フォルダ内のVC15フォルダのslnファイルを開いてビルドするだけかと思ったら違うようだ。
ネットで検索してビルドできる方法があるのが見つかった。
→ Compile libcurl on Windows with Visual Studio 2017 and SSL (WinSSL)
ソースコードのフォルダツリー内のコンフィギュレーション用のbatファイル(buildconf.bat)を実行してからwinbuildフォルダでMakefileをnmakeで指定して動かせばビルドできるらしい。
git clone https://github.com/curl/curl.git
でソースコードを取得し、
buildconf.bat cd winbuild nmake /f Makefile.vc mode=dll MACHINE=x64
とすればよいらしい。
しかしzipでダウンロードしたソースだとうまくいかない。Git for Windowsで取ったソースが必要だった。(一緒だと思うのだけど、なぜ?)
gitで取ってきたソースはnmakeでうまくビルドできた。
上記の例だとdll版をビルドしているのだが、自分はstatic版をビルドした。
64bit版と32bit版とをビルドしたが、自分は32bit版を使う。(一緒に使おうとしてるJSON用のJsmnというライブラリのバイナリが32bit版を使っているからだ)
ビルドのコマンドは、このようになる。
nmake /f Makefile.vc mode=static MACHINE=x86
しかししかし、リンクするとこれも最初のバイナリでダウンロードした.aファイルと同様にリンク時にエラーにってしまった。
結局gitで取ってきたソースをnmakeでビルドするときにdll版をビルドした。
dllのビルド方法はこのようにした。
nmake /f Makefile.vc mode=dll MACHINE=x86
dllを呼び出すリンクタイプの.libファイルをリンクする形で利用したらリンクエラーが出ずに無事にlibcurlを使うことができたようだ。
解決だ。
ただし、static版のlibcurlがリンクできない謎が残ってしまった。
libcurlのstatic libのリンクエラーの原因は、内部で使っているlibssh2とか幾つかのライブラリが足らないせいからかなあ、と思ってそれらのライブラリもバイナリ版をダウンロードしてきてリンクをしてみたのだが、未解決のシンボルのエラーが増えた。
—
あと、Visual Studio 2017の統合環境でstudio.hとかのヘッダーファイルが見つからない問題に遭遇した。普段は統合環境の設定とかの問題を避けるためコマンドラインでnmakeを介してVisual Studioを使うことが多いのだけど、コマンドラインで使う時にはstdio.hが見つからないとかのエラーに遭遇したことないのになあ。