2014年1月10日金曜日

New! How to install MinGW and Msys, and build opencv mingw library

しかし、いろいろ難しい、それを言うときりがないので、、、

ところで、Linuix側とWindows側でシームレスな開発環境をつくるためには、

MinGW上のgcc が欠かせない。

なぜなら、Linuxでも、Windowsでも、共通したソフトをつくる、もっとも確かな方法だから。

ところで、いろいろやっていると、さまざまな問題が起こってくる。

原因を調べてみると、ネット上の情報と、MinGWなどのメンテナンスの情報が

ずれていたり、理解されていないから。

それで、結果的に、いろいろ試して、現時点で一番いい方法というか、多分、

これからも変わらないと思う方法。この方法のポイントは、

単にコンパイルするとかではなく、cmakeの活用を前提に置いている事。

cmakeが活用できな環境構築は、今は、駄目でしょう。

下記は、DRY (Don't Repeat Yourself)の為のメモ

Opencvのminigw libraryをつくるためのcmakeの使い方まで含みます。

じつは、ここがむっちゃ苦労したところ。


1.MinGWのインストール(Msys単独のインストールは駄目)

必ず、mingw-get-setup.exe で行うこと。 ダウンロードは、下記のアドレスから。

http://sourceforge.net/projects/mingw/files/

インストール後には、ガイダンスに従ってインストールすればよい。

最小限のインストールだけでいいです。後に、追加のインストールをします。

ただし、Eclipseを使うのであれば、必ず、C:\MinGW にインストールすること。

これで、Msysもちゃんと入ります。別にダウンロードして、入れちゃだめよ!

2.環境設定

pathに、C:\MinGW\bin;C:\MinGW\msys\1.0\bin を設定する。

HOMEに、適当なディレクトリーを設定する。僕の場合は、HOMEに基本的に何も置かないので、

テンポラリー用のドライブDに D:\home と設定している。

あと、D;\home\.profileに設定をします。適当に、自分の環境に合わせてください。

if [ -n "${PS1:-}" ]; then
    export PS1="\[\e]0;\w\a\]\n\[\e[35m\]\D{%H%M%S} \[\e[32m\]\u
\[\e[0m\]\n\$ "
fi

umask 22

export LC_ALL=C
export LANGUAGE=en_US.UTF-8

export C_INCLUDE_PATH=/e/opencv/build/include
export CPLUS_INCLUDE_PATH=/e/opencv/build/include
export LIBRARY_PATH=/e/opencv/build/x86/mingw/lib
export PKG_CONFIG_PATH=/e/opencv/build/x86/pkg-config

#ALIAS set
alias ls='ls --color=auto'
alias ll='ls -al'
alias l='ls'
alias h='history 100'
alias cdhttp='cd /var/http'

alias n='cd /home;ls -al --color=auto'

alias rb='cd /f/robot/2W/2w/stereo'

この段階では、windows7以上を使っている場合には、再ログインかrebootをする。

理由は、解るよね。

3.追加ソフトのインストール

(1) mintty

C:\MinGW\msys\1.0\msys.bat を起動して、minttyをインストールする。

mingw-get update

mingw-get install msys-mintty

minttyのショートカットをdesktop上につくって、propertyに機動設定をする。

C:\MinGW\msys\1.0\bin\mintty.exe -tMinGW /bin/bash --login -i

(2) パッケージの update & upgrade

mingw-get update
mingw-get upgrade

なんか、apt-get と同じね。僕は、追加で、次のパッケージを入れました。

mingw-get install msys-coreutils msys-man msys-tar msys-gzip
mingw-get install msys-wget msys-zip msys-unzip msys-vim msys-rsync
mingw-get install msys-openssl msys-openssh
mingw-get install msys-patch msys-diffutils


(4) pkg-config 

これは、超大切です。ダウンロードは、下記のURL

http://www.gtk.org/download/win32.php

ダウンロードは、次の3つ。それぞれ、解凍して、C:\MinGW に上書きする。

pkg-config (runtime)、Glib (runtime)、gettext-runtime(Runtime)


4. cmake の インストール

下記から、ダウンロードしてインストールするだけ。

http://www.cmake.org/

 
5 OpenCv Minigw 用のlibrary作成のためのcmake オペレーション

これで、半日以上ハマった。思い出したくないから、やり方だけ。

http://robot009.blogspot.jp/2013/12/how-to-build-opencv-2472-mingw-on.html

と、下記の事を、合わせて読んでください。




Configure ボタンを押す

エラーが発生する。えっ!!


このpath 変更が、無茶苦茶大事。

これをしないと、minGWのWindowsの実装の問題で、

とんでもないエラーが表示されて、絶望的になる。

pathを変更して、再度Confrereボタンを押す


もう一回、Configure を押す。


で、Generation ボタンだよ



この後は、OpenCV/Build/x86/mingw で、mingw32-make install だぁ!!!

とっても、精神的に悪いエラーもでて、困ったので、

もう一度まとめなおしました。

Peaceだぁ!!

2014年1月6日月曜日

100yen shop is truly awesome

ばらして、基板に電池をつなぐ。

100均 ショップで、車のシガーライターから5V1A出力する機器を購入

さっそく、11.1V Lipoをつないで、確認。赤色LEDまでついている。

5.2V出力、チップも熱くならず。

チップは、MC34063APと書いてあるが、どうも、TI製ではない。

China パクリか?

チップの元本は、40Vまで入力OKのシロモノ


チップのパクリも、製品の価格もMade in chinaは、凄すぎ。

ある意味、ご立派。

日本は、もっと、危機感を持たないと、、、

というか、日本の基軸は製造業。

批判もあるかもしれないが、ITとか、サービス業とかではない、、、

だって、グローバルにビジネスしてないじゃん。

今の、贅沢に、うつつを抜かしていて、いいのだろうか?

やっぱり、製造業が復活しなければ、、、


Peace!!  じゃないなぁ

2014年1月5日日曜日

MinGW multithreading programming in C, and Now Project

今のProjectの目的は、

・開発生産性向上の為の、RDCSのシングルソース化の強化

・RDCSの性能向上の為に、マルチコア対応

・RDCSの、連続運転対応、対障害対応、リソースの有効活用を進めるための、

  一層の分散並列処理化

・入手性の良い、かつ誰でも1台は持っているWindowsマシンの有効活用促進


こんな所を目的に、改造作業をしています。

Version1も完成していない状態で、

ちょっと、悩むのだけど、このタイミングでしないと、やりたくても

できなくなってしまう。

特に、通信部分は、最も重要視している事の一つです。

やっぱり、HTTP通信は、業務系のシステムには良いけど、

ロボットシステムの通信系に使ってはならない事を痛感しました。

例えば、RDCSのような沢山のロボットを人工知能を搭載した協調制御するシステムで、

運用するのは、安全を考えれば、ダブル以上のチェック機能を持たせなければならないし、

それを分散環境で実現するためには、

独自のClient-Serverシステムで、専用のプロトコルで高速化や柔軟性を追求する

必要があるのだぁ。。。

だったら、Raspberry Piを使ってる事は矛盾じゃないのか?

なんて、意見もあるが、運用の時のハードはどんどん良くなるから変えればよい。

それより、安価で、10台のロボットを創って、上記のような事を確かめられる事の方が、

もっと意味がある。そう意味では、とってもバランスのよい開発マシンなのです。

Raspberry Piや、BBBは、、、、

僕は、開発や研究のマシンは、最新の性能でない方が良い場合も

あることを経験かつ体験的に理解しているよ。沢山、開発してきたから、、、


ところで、BBBは、Raspberry Piより体感的には、2倍以上の性能差を感じることがある。

一番感じるのは、pacmanによる大量のupgradeの時。

この作業は、まさにマシンの性能を測る上では、良いベンチマーク作業だと思う。


しかし、このようなシステムを開発可能なのも、gccなどの、オープンソースのおかげでです。

感謝感謝です。

そのおかげて、いろいろなシステムを構築することができる。

なんて、幸せな時代なのだとうと思います。

僕も、いつかは、恩返ししないと。。



で、昨日の懸案事項、今の段階で、いろいろテストしているけど、

ちゃんとOKだぁ。

(1) MinGWのSocketを使った、プログラムの確認

(2) MinGW下での、(1)とthreadを組合わせた場合の挙動


で、忘備録で、gcc 起動時の引数と、テスト時のヘッダーファイルをドーン。

ブログって、忘備録に最適なのでしゅ。。。

・MinGW
gcc threadServer0.c -o threadServer0 -mthreads -DDEBUG -DMINGW -lwsock32 -lws2_32 -lpthreadGCE2

・Linux
gcc threadServer0.c -o threadServer -lpthread

/***********************************************************
** Function : RDCS Communication Server & thread test
** File Name:
** Library  :
** Author   : Naoki Kabaya
** create   : 01/10/2014 version 1.0
** modify   :
***********************************************************/
//----------------------------------------------------------
// Includes
//----------------------------------------------------------
#include <stdio.h>
#include <stdlib.h> /* exit() */
#include <sys/types.h>

#if MINGW
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <sys/socket.h> /* socket(), bind(), listen(), accept(), recv() */
#include <netinet/in.h> /* htons() */
#include <unistd.h>
#endif

#include <pthread.h> /* pthread_create(), pthread_detach() */
#include <errno.h>

//----------------------------------------------------------
// Defines
//----------------------------------------------------------
#define _POSIX_SOURCE  1   /* POSIX comliant source (POSIX)*/
#define BUFFSIZE       256
#define FALSE          0
#define TRUE           1

#define PORT    50000 /* listening port*/
#define MAXDATA 1024 /* recieve buffer size */

#if DEBUG
#define PR(A,B) printf("--->%s.(%s)\n", A, B)
#define PRDI(A,B) printf("DEBUG--->%s.(%d)\n", A, B)
#define PRDS(A,B) printf("DEBUG--->%s.(%s)\n", A, B)
#else
#define PR(A,B)
#define PRDI(A,B)
#define PRDS(A,B)
#endif

#if MINGW
#define D_SOCKET_VAR SOCKET
#define D_SOCKET_CLOSE(A) closesocket(A)
#define D_SOCKET_WIN_INIT WSADATA wsaData;if (WSAStartup(MAKEWORD(2 ,0), &wsaData) == SOCKET_ERROR) {printf ("Error initialising WSA.\n");return -1;}
#define D_SOCKET_WIN_TERM WSACleanup()
#else
#define D_SOCKET_VAR int
#define D_SOCKET_CLOSE(A) close(A)
#define D_SOCKET_WIN_INIT
#define D_SOCKET_WIN_TERM
#endif

//EOF

MinGW socket programming in C

RDCSのネットワーク部分は、HTTPで実装してきたのだが、

やはり、性能などの点で問題があり、Client-Serverに戻すことにしました。

性能と、拡張性を確保するために変更します。

将来的な事を考えて、従来Winodws上で構築していたが、MinGW環境実装するように変更する。

基本的に確認しなければならないのは、2点で、

(1) Socketを使った、プログラムの確認

(2) (1)とthreadを組合わせた場合の挙動

で、最初に(1)をしました。

大丈夫だと思うは、コンピュータの世界は通用しないもんね。

重要なポイントは、次の3点に集約できる。その点を理解すれば、イイチャ。

a. MinGWは、winsockを使ってネットワークを実装しているので、おまじないが必要

b. 変数の型

c. リンクモジュール


a. おまじない
     ・include
         #include <winsock2.h>
         #include <ws2tcpip.h>

         通常の #include <sys/socket.h>,<netinet.h>などは使わない

     ・モジュールの初期化が必要

         変数宣言      WSADATA wsaData;

         初期化         WSAStartup(MAKEWORD(2 ,0), &wsaData);

         終了処理     closesocket(SOCKET  ss);

                           WSACleanup();

b. 変数宣言

       SOCKET を使う。POSIXは、int の descriptor 

         従って、read、writeは使えない。recvとsendを使う。
           
c. リンクモジュール

       -lwsock32 -lws2_32

以上です。   で、 serverとclientのテスト用モジュールをドーン

Peace!!

/***********************************************************
** Function : RDCS network system Server test
** File Name: server.c
** Library  :
** Author   :
** create   :
** modify   :
***********************************************************/
//----------------------------------------------------------
// Includes
//----------------------------------------------------------#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>
#include <winsock2.h>
#include <ws2tcpip.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
#include <errno.h>

//----------------------------------------------------------
// Defines
//----------------------------------------------------------
#define _POSIX_SOURCE  1   /* POSIX comliant source (POSIX)*/
#define BUFFSIZE       256
#define FALSE          0
#define TRUE           1

//----------------------------------------------------------
// Globals
//----------------------------------------------------------

//----------------------------------------------------------
// Prototype
//----------------------------------------------------------
int main();

/***********************************************************
** Function :
** Category :
** Parameter:
**          :
** ---------------------------------------------------------
** return   : normal end :0
**          : error      : -1  error progess is upper routine.
** note     :
**          :
************************************************************/
int main()
{
WSADATA wsaData;
SOCKET sock;
SOCKET sock0;

struct sockaddr_in addr;
struct sockaddr_in client;

//int sock0;
//int sock;

int len;
int n;
/*******************************************************
** Initialize
********************************************************/
if (WSAStartup(MAKEWORD(2 ,0), &wsaData) == SOCKET_ERROR) {
printf ("Error initialising WSA.\n");
return -1;
}

/*******************************************************
** Process
*******************************************************/
//------------------------------------------------------
// (1) Open Socket
//------------------------------------------------------
sock0 = socket(AF_INET, SOCK_STREAM, 0);
if (sock0 < 0) {
perror("socket");
printf("%d\n", errno);
return 1;
}
printf("after scoket\n");

//------------------------------------------------------
// (2) bind
//------------------------------------------------------
addr.sin_family = AF_INET;
addr.sin_port = htons(50000);
addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sock0, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
perror("bind");
return 1;
}

//------------------------------------------------------
// (3) listen
//------------------------------------------------------
if (listen(sock0, 5) != 0) {
perror("listen");
return 1;
}

//------------------------------------------------------
// (4) accept
//------------------------------------------------------
while (1) {
len = sizeof(client);
sock = accept(sock0, (struct sockaddr *)&client, &len);
if (sock < 0) {
perror("accept");
break;
}

n = send(sock, "RDCS SERVER", 11, 0);

if (n < 1) {
perror("write");
break;
}

//close(sock);
closesocket(sock);
}

/*******************************************************
** Terminate
*******************************************************/
//close(sock0);
closesocket(sock0);
WSACleanup();

return 0;
}



/***********************************************************
** Function : RDCS network system Client test
** File Name: client1.c
** Library  : 
** Author   : 
** create   : 
** modify   :
***********************************************************/
//----------------------------------------------------------
// Includes
//----------------------------------------------------------
#include <stdio.h>
#include <sys/types.h>
#include <winsock2.h>
#include <ws2tcpip.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
//#include <arpa/inet.h>
//#include <netdb.h>

//----------------------------------------------------------
// Defines
//----------------------------------------------------------
#define _POSIX_SOURCE  1   /* POSIX comliant source (POSIX)*/
#define BUFFSIZE       256
#define FALSE          0
#define TRUE           1

//----------------------------------------------------------
// Globals
//----------------------------------------------------------

//----------------------------------------------------------
// Prototype
//----------------------------------------------------------
int main(int argc, char *argv[]);

//----------------------------------------------------------
// Code
//----------------------------------------------------------

/***********************************************************
** Function : 
** Category : 
** Parameter: 
**          : 
** ---------------------------------------------------------
** return   : normal end :0
**          : error      : -1  error progess is upper routine.
** note     : 
**          :
************************************************************/
int main(int argc, char *argv[])
{
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in server;
//int sock;
char buf[32];
char *deststr;
unsigned int **addrptr;

/*******************************************************
** Initialize 
********************************************************/
if (argc != 2) {
printf("Usage : %s dest\n", argv[0]);
return 1;
}
deststr = argv[1];
if (WSAStartup(MAKEWORD(2,0), &wsaData) == SOCKET_ERROR) {
printf ("Error initialising WSA.\n");
return -1;
}

sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
return 1;
}

/*******************************************************
** Process 
*******************************************************/
//------------------------------------------------------
// (1)
//------------------------------------------------------
server.sin_family = AF_INET;
server.sin_port = htons(50000);
server.sin_addr.s_addr = inet_addr(deststr);

//------------------------------------------------------
// (2)connect
//------------------------------------------------------
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) != 0) {
perror("connect");
return 1;
}

//------------------------------------------------------
// (3)
//------------------------------------------------------
char vect[512]={0};
int get=recv(sock,vect,512,0);
printf("read=%s\n", vect);
/*******************************************************
** Terminate 
*******************************************************/
//close(sock);
closesocket(sock);
WSACleanup();

return 0;
}


//EOM

2014年1月4日土曜日

Tools : scale down image file

OpenCV を使って、画像ファイルを縮小するツール

単純に、長辺の画素サイズをして指定して縮小します。

縦横は、関係なくて、長辺ね。

一括処理するときに使ってまーしゅ。

何気に、便利よ

makefileもドーンしておきます。

Windowsでも、Linux環境でもそのまま動くはず。

Windows環境は、この前の前の投稿のMinGWと、MSYSでの環境を作ります。

resizeImg 元イメージファイル    縮小ファイル名     縮小後の長辺の画素数

あとは、ソース見てね。

Peace!!


//---------------------------------------------------------
// Function  : resize image data
// File Name : resizeImg.cpp
// Library   : OpenCV2
// Author    :
// Date      :
//---------------------------------------------------------

//----------------------------------------------------------
// Includes
//----------------------------------------------------------

#include <stdio.h>
#include "cv.h"
#include "cxcore.h"
#include "cvaux.h"
#include "highgui.h"

//----------------------------------------------------------
// Defines
//----------------------------------------------------------
#define _POSIX_SOURCE  1   /* POSIX comliant source (POSIX)*/
#define BUFFSIZE       256
#define FALSE          0
#define TRUE           1

//----------------------------------------------------------
// Globals
//----------------------------------------------------------

//----------------------------------------------------------
// Prototype
//----------------------------------------------------------

//----------------------------------------------------------
IplImage *srcImg = 0;
IplImage *dstImg = 0;

//**********************************************************
// Function :
// Category : OpenCV + OpenNI2
// Parameter:
//          :
// ---------------------------------------------------------
// return   : normal end :0
//          : error      : -1  error progess is upper routine.
// note     :
//          :
//***********************************************************
int main( int argc, char** argv ){

int iRez, iRezX, iRezY;
float fRatio;
char* filename;

//******************************************************
// Initialize
//******************************************************

if (argc != 4) {
printf("resizeImage1 inFile outFile maxResolution.\n");
return -1;
}

filename = argv[1];
iRez = atoi(argv[3]);

//******************************************************
// Process
//******************************************************
//------------------------------------------------------
// (1) set resize parameter
//------------------------------------------------------
    // Set original iamge
    if( (srcImg = cvLoadImage( filename, 1)) == 0 ) {
        return -1;
    }

printf("size width=%d,  heigh=%d\n", srcImg->width, srcImg->height);
if (srcImg->width > srcImg->height) {
fRatio = (float)iRez / (float)srcImg->width;
iRezX  = iRez;
iRezY  = (int)((float)srcImg->height * fRatio);
} else {
fRatio = (float)iRez / (float)srcImg->height;
iRezX  = (int)((float)srcImg->width * fRatio);
iRezY  = iRez;
}

//------------------------------------------------------
// (2) execute resizing
//------------------------------------------------------
// create save image buffer
    dstImg = cvCreateImage( cvSize(iRezX, iRezY), IPL_DEPTH_8U, 3);

// resize
cvResize(srcImg, dstImg, CV_INTER_CUBIC);

//------------------------------------------------------
// (3) Display
//------------------------------------------------------

    // display window
    //cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
    //cvNamedWindow("Resize", CV_WINDOW_AUTOSIZE);

    // display
    //cvShowImage("Image", srcImg);
    //cvShowImage("Resize", dstImg);

    // enter key
    //cvWaitKey(0);
 
    //Save
    cvSaveImage(argv[2], dstImg);

//******************************************************
// Terminate
//******************************************************
    cvReleaseImage(&srcImg);
    cvReleaseImage(&dstImg);

cvDestroyAllWindows();

    return 0;
}


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


TARGET = resizeImg1
CC = g++
OBJS = $(TARGET).o
CFLAGS = -Wall -O2
LDFLAGS = -lm
OPENCVINC = `pkg-config --cflags opencv` -I/usr/include
OPENCVLIB = `pkg-config --libs opencv`

all: $(TARGET)

$(TARGET): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(OPENCVLIB)

.cpp.o:
$(CC) -c $< -o $@ $(CFLAGS) $(OPENCVINC)

.c.o:
$(CC) -c $< -o $@ $(CFLAGS) $(OPENCVINC)

clean:
rm -f $(TARGET) $(OBJS)

2014年1月2日木曜日

Source code management using Google Drive

ちょっと、いろいろ整理中です。

ソース管理などは、こんな感じでやっています。


基本的には、真ん中のWindowsマシン上でMinGWをインストールして、CDTで開発

バックアップは、Google Driveを利用して自動バックアップ

これって、何も気にする必要がないので、超ラクチン

もちろん、ソースのリビジョン管理なんかはできないけど、

それぞれのソフトのタイミングをみて、tarファイル作るので、何の問題もない。



デバイスを制御する部分だけ、Raspberry Piや、BeagelBone Blackで開発する。

その時は、FileZillaを、ファイルエクスプローラとして使って、

コマンドはputtyでssh接続してたたく。

真ん中のPCにクロス開発環境を載せる方法もあるけど、

デバイス関連のソフトは、CPUパワーを必要としないので、わざわざ載せる必要はない。

OSは、ArchLinuxのRolling Release(RR)で、いつも最新。

問題が発生するのではと思ったのだけど、RRだからって何の問題も発生しない。

基本、gcc,  g++でしか開発をしないので、関係ないかも。


ロボットは、Raspberry PiやBBBで作っているので、

真ん中のマシンで作ったコードを、Raspberry PiやBBBのマシンでBuildするけど、

問題は、発生していない。


というか、過去の経験から、変数の定義方法から始まって、

問題が起こらないようにしている。


Google Drive様様で、ごぜいましゅ。ちなみに、25GBの無料利用です。

また、現在開発中のクラウドも、25GBあれば十分。

農業クラウドで、日本の企業が有料でサービスしているけど、

そのような有料は使わなくてもよい。

僕のロボットシステムと、農業生産管理のシステム発表したら、

みんなGoogleでやるんじゃないの?

Peace!!

Setting : MinGW and MSYS

元旦も、お仕事

画像処理径は、やっぱりCore i7で、高速処理するのが良い。

今までは、勉強不足でWindowsの開発環境と、Linuxの開発環境をそれぞれ作っていたのだけど、

Makwfileの変換ツールとか、ちょっとした小ネタのツールで、問題はなく相互で開発をしていた。

ただ、も一度考えると、無駄かなぁと考えて、

Eclips CDTの為に、インストールしていたMinGWで共通の環境を作ってみようと、

元旦に設定した時のメモ

POSIX thread も追加でインストール


(1) MinGWと、MSYSのインストール

これは、沢山説明しているサイトがあるので、そちらを見てチョンマゲ。

ただ、CDTを使うなら、C:\MinGWに、インストールする事

これも、忘れちゃダメよ

mingw-get update

mingw-get upgrad

mingw-get install xxxx              xxxxは、欲しいソフト

pkg-configは、下のURLから4つのパッケージをdownload、解凍しC:\mingwに上書き

http://www.gtk.org/download/win32.php

gettext-runtime
glib
gtk+
pkg-config

(2) MSYSの設定

起動時の環境変数、Aliasなどの設定

これは、.bashrcで行う。ついでに、

自分のサンプル

if [ -n "${PS1:-}" ]; then
    export PS1="\[\e]0;\w\a\]\n\[\e[35m\]\D{%H%M%S} \[\e[32m\]\u
\[\e[0m\]\n\$ "
fi

umask 22

export LC_ALL=C
export LANGUAGE=en_US.UTF-8

export C_INCLUDE_PATH=/e/opencv/build/include
export CPLUS_INCLUDE_PATH=/e/opencv/build/include
export LIBRARY_PATH=/e/opencv/build/x86/mingw/lib
export PKG_CONFIG_PATH=/e/opencv/build/x86/pkg-config

#ALIAS set
alias ls='ls --color=auto'
alias ll='ls -al'
alias l='ls'
alias h='history 100'
alias cdhttp='cd /var/http'

alias n='cd /home/Naoki;ls -al --color=auto'
alias rb='cd /f/robot/2W/2w/stereo'


ついでに、.profile

exec /bin/bash


(3) OpenCVのライブラリー

前の投稿で記述したMinGWのOpenCVの、ライブラリー名を変更
make などをすると、ライブラリーが無いとか、メッセージがでるので、

当該のライブラリーをコピーして、リネームする。

それぞれの人の環境で違うとおものうで、、、、手作業


(4) Makfileは、Linuxと同じものが使える

CDT上で開発するけど、結構、makeする事が多い。

MSYSは、bashシェル上が動くから、ちゃんとpkg-configも展開される。

ただし、opencvは、2.4.7から、mingw用ライブラリーは

自分でbuildしなければならなかった。

その時に、unix-installにできるopencv.pcは、WindowsのドライブがE:などのように

指定される。これは、これで良いのだが、Msys上では、E:は変換されない

従って、新たにpkg-configというディレクトリーを作って、

ドライブ指定を E: から /e/ に変更したopencv.pcを作っておく。

それをexport PKG_CONFIG_PATH=/e/opencv/build/x86/pkg-config と、

.bashrcで設定している。

これで、Mkafileは、Msys(Windows)と、Linuxで同じものが使える。

例えば、、、、

TARGET = pp
CC = g++
OBJS = $(TARGET).o
CFLAGS = -Wall -O2
LDFLAGS = -lm
OPENCVINC = `pkg-config --cflags opencv` -I/usr/include
OPENCVLIB = `pkg-config --libs opencv`

all:    $(TARGET)

$(TARGET):      $(OBJS)
        $(CC) -o $@ $(OBJS) $(LDFLAGS) $(OPENCVLIB)

.cpp.o:
        $(CC) -c $< -o $@ $(CFLAGS) $(OPENCVINC)

.c.o:
        $(CC) -c $< -o $@ $(CFLAGS) $(OPENCVINC)

clean:
        rm -f $(TARGET) $(OBJS)


(5) その他メリット

・gcc, g++  開発 は、超ラクかも

多少のリビジョンの違いはあるけど、WindowsとLinux側で、同じソースが動く

従って、Windosw側(MSYS)で開発して、Linuxにソースを送ってmakeするだけ。

だから、sambaなどで共有設定しておけば、面倒はかなり減る。

ただし、日本語は、わからない。僕は、日本語をソースコード内で使わない。


・ シェル類が、同じものが使える

ルートになるパス設定だけ、環境変数を読むようにしておけば、

同じシェルが使える


ということで、「もっと早くやっとけばよかった」


追加 POSIX thread  ---------------------------------------------

ダウンロード   https://sourceware.org/pthreads-win32/

The folder "Pre-built.2" contains the folders "lib" and "include", copy its contents into the MinGW folders of the same name. 

The folder "dll" contains pthreadGC2.dll and pthreadGCE2.dll , copy to MinGW/lib.

Important if using exception handling: Compile your application with the additional compiler switch "-mthreads". 

Peace!!