ページ 11

VisualC++ 2010とlibcurl

Posted: 2014年5月09日(金) 09:27
by lp6m
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ライブラリだけのコードをかいてみたところ正しくコンパイルが通り動作もしています.

どなたか解決策をお願いします.

コード:

#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;
}

Re: VisualC++ 2010とlibcurl

Posted: 2014年5月09日(金) 10:06
by softya(ソフト屋)
そもそもDLLが古いんで2010ではコンパイルされていないと思います。
つまり必要とするMVCランタイムが2008以前の物であると推測されるわけです。
2005なのか2008なのかぱっと見で書いてないので、両方共ランタイムを入れてみては?

Re: VisualC++ 2010とlibcurl

Posted: 2014年5月09日(金) 10:51
by lp6m
http://www.microsoft.com/ja-jp/download ... x?id=18471
http://www.microsoft.com/ja-jp/download ... px?id=2092
VC++ランタイムを2005,2008ともにインストールしましたが、何も症状がかわりませんでした・・・

Re: VisualC++ 2010とlibcurl

Posted: 2014年5月09日(金) 11:05
by softya(ソフト屋)
あとで調べてみます。他にも色々実験してみてください。リリースビルドしたら通る気もしますが。

Re: VisualC++ 2010とlibcurl

Posted: 2014年5月09日(金) 22:25
by lp6m
いろいろ実験しましたが、まったく症状がかわりません。。。

どなたか解決策を教えていただけないでしょうか。。。

Re: VisualC++ 2010とlibcurl

Posted: 2014年5月09日(金) 22:41
by milla
もしかしたら、プログラムはx86でビルドされているのに、ライブラリはx64をつかってビルドしてません?(もしくは逆
あほな話ですが、自分SDL2.0にてそれで一回ハマったので