VisualC++ 2010とlibcurl
Posted: 2014年5月09日(金) 09:27
VisualC++でlibcurlをつかったプログラムをくんでいたのですが、ビルド,コンパイルは通るのに実行できないので質問させていただきます.
もともとMacでg++をつかって実行していたコードをWIndows上で動かそうとして,VisualC++で動かそうと試みました.
手順はほとんどここ(http://breckon.eu/toby/teaching/dip/rov ... _setup.pdf)
にかいてある通りに行いました。
libcurlのパッケージのリンクが切れていたので,http://curl.haxx.se/latest.cgi?curl=win ... ロードしたファイルを
解凍し,C\libcurlにコピー,VCの設定からインクルードディレクトリを設定,ライブラリディレクトリを設定,追加のライブラリのところにcurllib.libと入力(上のpdfではlibcurlとなっているがバージョンが違うためか名前がちがう)しました.
またDXライブラリと共存もしたかったので,マルチバイト文字を使用,MTdに変更をし,main関数をDXライブラリ用にWinメイン関数にかきかえました.
そしてコンパイルをかけてみたところ,ビルドは通ったのですが、(コードはこの質問の最後に貼っています)
curllib.dllが見つからないから実行できないとのダイアログがでました.
調べてみると環境変数の設定ができていないためにcurllib.dllを見つけられないようだったので,環境変数のところにcurllib.dllが存在すフォルダC\libcurl\Debug\ を追加しました.
すると次にでてきたダイアログは,
アプリケーションを正しく起動できませんでした.(0xc150002).というものでした
0xc150002というエラーコードで検索してみると,VC++のランタイムがインストールされていないために起動しないと書かれたページばかりで,VC++をインストールしているのにランタイムが入っていないことはまさかないだろうと思いつつも,とりあえず再インストールしましたが,何も変わりなく,このエラーがでてしまいます.
開発環境はVisualStudio 2010 C++ ,Win8Pro(64bit) です.DXライブラリ,libcurl,picojsonを使用しています.
以下がその動かそうとしたコードです.書き換える前のコードを貼っていますが,main関数はint WINAPI...ではじまる関数に, coutはprintfDxにして実行しました.
macOSで動作していたときは,g++ -lcurl main.cppなどでコンパイルが通り,動作もしていました
また,DXライブラリだけのコードをかいてみたところ正しくコンパイルが通り動作もしています.
どなたか解決策をお願いします.
もともとMacでg++をつかって実行していたコードをWIndows上で動かそうとして,VisualC++で動かそうと試みました.
手順はほとんどここ(http://breckon.eu/toby/teaching/dip/rov ... _setup.pdf)
にかいてある通りに行いました。
libcurlのパッケージのリンクが切れていたので,http://curl.haxx.se/latest.cgi?curl=win ... ロードしたファイルを
解凍し,C\libcurlにコピー,VCの設定からインクルードディレクトリを設定,ライブラリディレクトリを設定,追加のライブラリのところにcurllib.libと入力(上のpdfではlibcurlとなっているがバージョンが違うためか名前がちがう)しました.
またDXライブラリと共存もしたかったので,マルチバイト文字を使用,MTdに変更をし,main関数をDXライブラリ用にWinメイン関数にかきかえました.
そしてコンパイルをかけてみたところ,ビルドは通ったのですが、(コードはこの質問の最後に貼っています)
curllib.dllが見つからないから実行できないとのダイアログがでました.
調べてみると環境変数の設定ができていないためにcurllib.dllを見つけられないようだったので,環境変数のところにcurllib.dllが存在すフォルダC\libcurl\Debug\ を追加しました.
すると次にでてきたダイアログは,
アプリケーションを正しく起動できませんでした.(0xc150002).というものでした
0xc150002というエラーコードで検索してみると,VC++のランタイムがインストールされていないために起動しないと書かれたページばかりで,VC++をインストールしているのにランタイムが入っていないことはまさかないだろうと思いつつも,とりあえず再インストールしましたが,何も変わりなく,このエラーがでてしまいます.
開発環境はVisualStudio 2010 C++ ,Win8Pro(64bit) です.DXライブラリ,libcurl,picojsonを使用しています.
以下がその動かそうとしたコードです.書き換える前のコードを貼っていますが,main関数はint WINAPI...ではじまる関数に, coutはprintfDxにして実行しました.
macOSで動作していたときは,g++ -lcurl main.cppなどでコンパイルが通り,動作もしていました
また,DXライブラリだけのコードをかいてみたところ正しくコンパイルが通り動作もしています.
どなたか解決策をお願いします.
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <curl/curl.h>
#include "picojson.h"
using namespace std;
static char* errorBuffer;
string buffer;
picojson::value v;
static int writer(char *data, size_t size, size_t nmemb, string *buffer);
int JsonFirstLoad();
int MoveJsonGet(int move);
int JsonParse();
void ShowState();
int data[4][4];
bool over;
long long int score;
int cnt=0;
string ssid;
#define UP 0
#define RIGHT 1
#define DOWN 2
#define LEFT 3
int main(){
if(!JsonFirstLoad()){
//Jsonのロードに失敗
cout<<"JsonLoadError"<<endl;
return 0;
}
if(!JsonParse()){
cout << "JsonParseError" << endl;
}else{
cout << "SessionID:" << ssid << endl << "GameStart" << endl;;
}
while(1){
//ゲーム開始
ShowState();
if(over==true){
cout << "GameOver" << endl;
break;
}
dir=cnt%4;//今は適当
MoveJsonGet(dir);
JsonParse();
cnt++;
}
return 0;
}
int JsonFirstLoad(){
CURL *curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
curl_easy_setopt(curl, CURLOPT_URL, "http://2048.semantics3.com/hi/start/json");
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
CURLcode result = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (result == CURLE_OK) {
return 1;
} else {
return 0;
}
}
return -1;
}
int MoveJsonGet(int move){
if(move == UP ) cout << " NEXTMOVE: UP" << endl;
if(move == LEFT ) cout << " NEXTMOVE: LEFT" << endl;
if(move == DOWN ) cout << " NEXTMOVE: DOWN" << endl;
if(move == RIGHT ) cout << " NEXTMOVE: RIGHT" << endl;
buffer=" ";
char MoveUrl[100];
sprintf(MoveUrl,"http://2048.semantics3.com/hi/state/%s/move/%d/json",ssid.c_str(),move);
CURL *curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
curl_easy_setopt(curl, CURLOPT_URL, MoveUrl);
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
CURLcode result = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if (result == CURLE_OK) {
return 1;
} else {
return 0;
}
}
return -1;
}
int JsonParse(){
istringstream is(buffer.c_str() ); is >> v;
string err = picojson::get_last_error();
if(!err.empty()) {
cerr << err << endl;
return 0;
}
picojson::object& o = v.get<picojson::object>();
over = o["over"].get<bool>();
score = (int) o["score"].get<double>();
ssid = o["session_id"].get<string>();
picojson::array grid = o["grid"].get<picojson::array>();
for (int i = 0; i < 4; i++) {
picojson::array line = grid[i].get<picojson::array>();
for (int j = 0; j < 4; j++) {
data[i][j] = line[j].get<double>();
}
}
return 1;
}
void ShowState(){
for(int i=0;i<4;i++){
for(int j=0; j<4;j++){
cout<<data[i][j];
if(j!=3) cout << " | ";
}
cout<<endl;
}
cout << "Score:" << score << " MoveCount:" << cnt;
}