2017年7月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

Amazonウィジェット

  • miniPC
  • 最近買った本
  • Raspberry Pi
  • クアッドコプター
  • 書籍ランキング

AdSense

  • 広告
無料ブログはココログ

VC++

2016年12月11日 (日)

C++ VisualStudio2013を使ってopenCVのプロジェクトを簡単に試す

最初にVisualStudioに出会った頃はCDが入ったパッケージ版しかなく(6.0とかそれくらいのころ)、もっぱらLCCとかcygwinに入っているgccとかを使ってチマチマとしたプログラムを書いていました。

今は全部VisualStudio+たまにVimとか使うのですが、一旦VisualStudioの便利さを知ってしまうと、なかなか他のツールには手を出そうとは思わなくなりました。

VisualStudioを使っていてもちょっと大変なのは、openCVを使ったプログラムで、これのライブラリの設定については沢山HPがあるのですが、どれもこれもバージョンが少し違ったりするだけで画面が変わったり、パスがちょっと変更になったりで、なかなか載っている通りにはいかんです。
いまはNuGetパッケージという大変便利なものがあって、ボタンひとつでセットアップが完了します。
この記事は、このサイトを見て試した結果を書いています。

そのまんまopenCV3.0を入れてみたのですが、
なぜかopenCVの中で使っている関数がエラーを起こしてうまく行きませんでした。

そこで2.4.10を入れなおしてみました。
インクルードのパスが少し変わっていて、下記のように書くといけました。

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>

このサイト
の、5.1のソースを使ってテストしました。




2015年6月 7日 (日)

ODE(Open Dynamics Engine)をVC++2013(Visual Studio2013)にインストールする。

このあいだVC++2013とode-0.12の組み合わせでプロジェクトを作成したとき上手くいったので、今度は別のPCでVC++2013とode-0.13の組み合わせを試すことにした。

※vc2013の変換機能があればvc2010までしか対応してなくてもいけるはずと踏んだので。

この記事は前回の記事の続編です。
詳しいことはこちらに記載しています。

いままでのやり方で一通り設定。

上手くいくと思ったら
LINK2019がでて 未定義のglBeginが参照された。
とエラーが出る。

でむさんのここのページを見ていたら

質問コーナーで
hogegeさんが
「自分も似たような”oded.dll”がないというエラーに引っかかりましたが、
以下のリンカー設定にしたら通りました。」
と発言されており

ode_doubled.libdrawstuffd.libをリンクするほかに
user32.lib;winmm.lib;gdi32.lib;opengl32.lib;glu32.lib;%(AdditionalDependencies)
というライブラリをリンクする必要があることがわかった。

そこで
opengl関係のlibが入っていないことに気づいたので
リンカーの入力でopengl32.libとglu32.libを追加してみた。

すると
こんどはdrawstuff関係のエラーが出た。

winmm.lib
というのが入っていなかったので追加するとコンパイルできた。


感想
VCで自作のライブラリファイルを作ったりする機会があれば、これが原因かなと勘が働くので、VCでのインクルードやリンカに親しんでおくのがよいと思う。
HPやブログの情報は、それを書いた人の環境とかodeやvcのバージョンによってちょっとづつ違うこともあるから、操作している内容の意味を理解してないと、ちょっとのトラブルでわけわからなくなる。今回のようにopengl関係のlibが入っていないことが原因のこともあり、キーワードodeでgoogle先生していたら永遠に解はなかった。






2015年4月18日 (土)

VC++で原因不明のLNK2019エラー

VisualStudio2010で簡単なCソースを打ち込んで、デバッグに使おうと思っていたら
2個のCファイルと1個のヘッダファイルだけの構成なのに

lnk2019 未解決の外部シンボル が関数 _main で参照されました。

のコンパイルエラーが出てちっとも前に進まない。
プロジェクトの設定を触った覚えはないし、引数の型や名前などリンクの障害になるようなにおかしなところはなかったのだが

よく見るとプロジェクトに入っているソースの拡張子がCとCPPの二種類が混じっていた。
全部Cで書くつもりだったのだが新しいファイルを追加するときにCPPの拡張子が自動的についたらしい。

CPPをCに直したらコンパイルできた。





2015年3月13日 (金)

ODEを何とかしてVisualStudio(2010, 2013)にインストールする

きっかけ
今までODE(フリーの物理エンジン)は、インストールが簡単なCode::Blocksで使っていたのだが、ODE+何か別の機能を実装する機会があり、ちょっと煩わしくなってきた。
ライブラリのインクルードやちょっとした設定に慣れていないこと。MinGWなのにsocketはWinsockを使うなど、ちょっと変な癖があることがわかって来たためだ。そしてなんと言っても、VisualStudioのチェック機能、デバッグ機能が充実しているので、やはりそっちに移行したいと考えていた。

うまく行く組み合わせはode-0.12とVS2010でした。
結論を先に読みたい方はsection2まで飛ばしてください。
⇒ode-0.12とVS2013の組み合わせも後で試したら成功しました。

section1 紆余曲折--------------------------------------------------

どうせならなるべく新しいバージョンがいいと思ったので
まずode-0.13とVS2010の組み合わせで試してみた。

まずode-0.13を解凍すると、なかにbuildというフォルダがある。
build\premake4.exe

--helpを実行すると、VS2010というオプションがあるので、そのバージョンのソリューションファイルが出せることがわかった。

※premake4のなぞ。
windowsというフォルダがあるが、そっちでは使えず。トップにあるやつをつかう。
ode0.13であればvs2010のオプションが用意されている。


コマンドはこのように打ち込む。
premake4 --with-demos --with-libccd vs2010

ちなみに他のHPにあるコマンドをいろいろ試したのだが、
premake4 --with-demos --with-libccd --only-double --only-static vs2010

というやつでpremakeしてしまうと、vs2010でどんなに頑張ってもDebugDoubledやReleaseDoubleのビルド構成がでてこなかった。

このオプションが出てこないことにはode_doubled.libなどの必要なライブラリファイルが作れない。

slnファイルが出来ているはずなので、それを開いてビルド。

※2010のオプションを指定したのになぜかバージョン変換が実行され、
変換されなかったファイルがありますなどと不穏な空気が流れるが、特に問題なく開けた。

ビルドオプションはDebugDoubleLib
DLLよりLibのほうがよいとかいう噂なので、それを指定した。
Releaseも使うようならReleaseDoubleLibも一緒にビルド。

ビルドしたらlibというフォルダにDebugDoubleLibというフォルダができ、
そのなかにlibファイルが完成している。

※プロジェクトのフォルダの中に生成してくれないところがちょっとヒヤリとする。

インクルードとライブラリファイルは2010ではプロジェクトごとに指定なので、でむさんのページのVS2008の手順とはちょっと異なる。これらは個別のプロジェクトのプロパティから指定するようになっている。

全ての設定を終えて、コンパイルも通ったのだが、なんとここに来てhandle関係のエラー。
ソース自体のバグっぽいのでなんともならず!!!

結論:VS2010とODE0.13は動かない!?



section2 成功事例--------------------------------------------------


つぎに、VS2010とode0.12の組み合わせを試してみた。

またpremakeから順番に。
premake4.exe --with-demos --with-libccd vs2008

ode-0.12\build\vs2008\ode.sln
このファイルと、その他たくさんのプロジェクトファイルが出来ているので、slnファイルを開く。

※ちなみに、VS2013とか他のバージョンも入っているなら、右クリックでどのバージョンで開くかをセレクトすることもできる。必ず2010指定で開くこと。

 

premakeでオプションさえあっていれば、(only-doubleとか入れなければ)
ちゃんとDebugDoubleLibがビルド構成でセレクトできる。

Ws000040

プロジェクトのプロパティから、
先ほど作ったVS2008のslnファイルでコンパイルして出来たライブラリの場所を指定する。

Ws000041

そしてビルド。
Debug構成でビルドなら通るはず。

ついに実行!!!
とりあえずウィンドウが出て、メモリ関係のエラーが出なければ大成功でしょう。

サンプルソースなんかをそのまま実行すると、
PCの性能によりものすごく早く計算が終了してしまう場合があるので、
そのときはdWorldStepにあるタイムステップ値を小さくすればOK。

dWorldStep(world,0.0001);

---------------------------------------

まとめ

いくつもの難関があるが、一度仕組みがわかればなんとかなる。
1.premakeコマンドで必要なファイル(VS2008のソリューションファイル)を生成させる。
2.ソリューションファイルから、しかるべきビルド構成でコンパイルする。
3.新規プロジェクトを作成し、インクルードファイルとライブラリファイルの場所を指定する。

でむさんのプロジェクトファイルを使わなくてもなんとか構築できた。




section3 成功事例 VS2013--------------------------------------

VisualStudioは毎年バージョンが新しくなるし、情報が沢山あってやりやすそうなバージョンはリンクが消されて二度とインストールできなくなる危険性がある。
できるだけ新しいバージョンで動作確認をしたいと思ったので、今度はVS2013とODE0.12の組み合わせでやってみた。

ODE0.12のライブラリファイルは、VS2010で作ったやつをそのまま流用した。





VS2013でビルドした場合
まずdSINGLEもしくはdDOUBLEをDefineせよとエラーが出る。

インクルードとライブラリを指定したあと、さらにlibを一個ずつ指定する必要がある。
この二つを追加する。

ode_doubled.lib
drawstuffd.lib




これでコンパイルは通る状態になり、実行ファイルが生成されるが、
いざ実行するとcould not load acceleratorsというエラーでコケる。

たぶんOpenGLのことだろうと思って下記を追加してみた。VS2010の動いたプロジェクトのプロパティを参考にした。

opengl32.lib;glu32.lib;winmm.lib;


しかし同じエラーでコケてしまった。

could not load acceleratorsで検索したら、丁度当てはまる情報があった。

ode-0.12\drawstuff\src
に入っている、

resource.h
resources.rc
という二つのファイルをプロジェクトに入れるとある。

リソースファイルをフォルダに入れるだけじゃだめで、
ソリューションエクスプローラからプロジェクトに入れなければならない。

Ws000043


こんどはsky.ppmのテクスチャファイルがないと怒られた。
しかしこれはそんなに難しくなさそうだ。
テクスチャファイルのありかを指定する箇所を修正すれば実行することが出来た!!!

これでVS2013でODE0.12を動かすことができた。
※サンプルのソース(ボールがただ落下するだけの内容)が走っただけなので、細かいチェックはしてません。









2014年12月12日 (金)

VC++でTCPソケットプログラミング winsockの使い方。

VC2013を使ってソケットプログラミング。
いままでGCCだったのだが、どうにもopenGLのインストールが上手くいかず、仕方なくGLが動くVC(visual c++)環境に流れ着いた次第。

VC++で最初にするのは、インクルードの設定。
winsockのlibを追加する。この操作をしないとマクロを書いただけではインクルードされない。

Winsock

これはVC++2013expressの画面。

ソース側で気をつけること。ミソはWSADATA
こいつがWinsockを使うために必要で、クラスの中のメンバ変数としている。
WSAStartupを使ってwinsockのAPIを使用できるようにする。

WSADATAがセットされていなかったら、listenもacceptもrecvも、なにもブロッキング制御されずに素通りする。なにも実行されずに終了してしまうのだ。それでいてコンパイルはすんなり通過してしまう。linuxプログラミングをやっているときは全く関係ないので、最初全然わからなかった。

「main_VC13_hello_server.cpp」をダウンロード

processingを使った通信テスト用のサーバーとクライアント。
窓の中でマウスポインタを移動させると、その座標データをTCPで垂れ流す。
データを出すほうをサーバと呼ぶべきなのか、クライアントと呼ぶべきなのか、迷うので両方作った。

「tcpClient_Tester.pde」をダウンロード
「tcpServer_Tester.pde」をダウンロード

上のpdeファイルと一緒に使う、データ受け側のプログラム。
※VC++側をクライアントとしているので、tcpServer_Tester.pdeを実行すること。

「tcpClient.h」をダウンロード
「main_client.cpp」をダウンロード

余談:通信とかカメラとか、ちょっとややこしいヘッダとかライブラリを使わないと出来ないようなことでも、Processingならソースをチョコチョコっと書くだけで実現できる。こういう時は非常に重宝。




オマケ:
TCP,UDP ソケットプログラミングのテストをするときのファイアウォールの設定。

アプリケーション毎、プログラム名毎にルールを設定していると、リストが直ぐに一杯になり、警告を閉じるのが面倒だ。
そこで、プロトコル(ポートの番号)でルールを定義するとよい。テスト用で使うポート番号を決めておくと、そのポートを使う分には実行ファイル名が変わってもルールの設定は不要だ。当たり前だけれども。

2012年11月22日 (木)

VC++2010のプロジェクトの設定

プロジェクトを作成したあと、やっておいたほうがいい設定。
※趣味で使う程度のプログラムにおいては、という前提です。


☆プリコンパイル済みヘッダーを使用しない。

Projectのプロパティから、
構成プロパティ⇒C/C++⇒プリコンパイル済みヘッダー

コンパイル構成DebugとReleaseの両方に設定が必要。



VS2013からセキュリティ関係のエラーが出るようになった。このオプションはデフォルトでONになっているので、結構煩わしい。

たとえば、gccと同じ感覚でファイルを開くソースを書いたとする。
コンパイルしたら、fopenはセキュリティの問題があるから、それに対応したfopen_sを使え!!というエラーが沢山出てくる!!

え”なんで!?と焦ってMSDNを見たら、なにやら分けのわからん引数が沢山追加されていて。。。というトラブルに巻き込まれる。
いちいち対応するのが面倒なので、普段はOFFにしてます。