プロが教える店舗&オフィスのセキュリティ対策術

Microsoft Visual Studio .NET 2003で書かれたプログラムをLinux移植しようとしているのですがどこがどう違ってくるのでしょうか?
使用言語はC++です。あまりプログラムに詳しくないものでGoogleなどで調べてもよくわかりませんでした。
参考になるURLでもいいのでどなたか御教授お願いします。

A 回答 (17件中1~10件)

私も手っ取り早くコンパイルしてみることをお勧めします。


詳しくない人が下調べしまくっても移植を始めてから問題が出てくるだけだろうと思いますので、コンパイルしてみて出てくるエラーをここで聞いたほうが早いと思います。
今Linuxの環境があるのであれば、#include <windows.h> をコメントアウトして、makefileなんて書かなくてよいですから、gcc -c file.cで試しにコンパイルしてみましょう。
    • good
    • 1
この回答へのお礼

回答ありがとうございます.
返事が遅くなりましてすみません.
Linuxの環境で#include <windows.h>をコメントアウトしてコンパイルしてみたところエラーがたくさん出てきました.
Windowsでは#include <windows.h>をコメントアウトしてもビルド,実行はできました.

お礼日時:2007/08/10 03:15

>Serial.cc:103: error: 文法エラー before `{' token


>ソース:if(write(ComFd, &data, sizeof(BYTE)){
勘ですが、これで直るかも?
if( 0 < write(ComFd, &data, sizeof(BYTE) ){
これでだめなら、CmdFd,data,BYTEがちゃんと定義されているか確認とwriteだから
#include <stdio.h>
が定義されているかを確認してください。

>Serial.cc:155: error: `COMSTAT' undeclared (first use this function)
>Serial.cc:155: error: (Each undeclared identifier is reported only once for each function it appears in.)
>Serial.cc:155: error: 文法エラー before `;' token
>ソース:COMSTAT ComStat;
これもRS232C関係ですね。下と交えて解説します。

>Serial.cc:158: error: `hCom' undeclared (first use this function)
>Serial.cc:158: error: `ComStat' undeclared (first use this function)
>Serial.cc:158: error: `ClearCommError' undeclared (first use this function)
>ソース:ClearCommError(hCom, &dwErrors, &ComStat);
undeclared はすべて定義されていないと言う意味です。COMSTATと関数ClearCommErrorはすでに受信しているサイズを調べるのに使います。Serial.ccの中でどのような処理が行われているか分からないので断言できませんが、linuxで直接代替する関数は知りません。
やはり単純な関数の置き換えでは移植は難しいようですので、Serial.cc全体をちゃんと理解してlinux用に書き換えないと動かないと思います。

参考になりそうなページをみつけたのでご覧ください。
http://www.linux.or.jp/JF/JFdocs/Serial-HOWTO.html
    • good
    • 0
この回答へのお礼

ありがとうございます.
もう少しシリアル通信について自分で勉強してみます.

お礼日時:2007/09/13 19:33

そのまま置き換える関数はLinuxには無さそうです。


なので代案を提案します。とついでに訂正を。
open時にO_NONBLOCKを指定していますので、非ブロックアクセスモードになっていました。
この場合、read後やwrite後にselect関数で同期処理を行うようにプログラムを修正してやるやる必要がありました。このselect関数のパラメータとしてタイムアウト時間を指定することができます。これを使えば同等にタイムアウトの処理が実現できると思います。

ただし、私はRS232Cの通信がLinuxでは経験がないので、ウソを言っている可能性があるのを警告しておきます。

このあたりを参考にしてみてください↓。
http://homepage3.nifty.com/skyone/item12.html
たぶん、テストと試行錯誤を繰り返して、うまく行く方法を探ることになるかと思います。

この回答への補足

ありがとうございます。

私もまだ全然理解できていないのでもう少し調べてみます。
他にもエラーが出ているので見ていただけますか?

Serial.cc:103: error: 文法エラー before `{' token
ソース:if(write(ComFd, &data, sizeof(BYTE)){

Serial.cc:155: error: `COMSTAT' undeclared (first use this function)
Serial.cc:155: error: (Each undeclared identifier is reported only once for each function it appears in.)
Serial.cc:155: error: 文法エラー before `;' token
ソース:COMSTATComStat;

Serial.cc:158: error: `hCom' undeclared (first use this function)
Serial.cc:158: error: `ComStat' undeclared (first use this function)
Serial.cc:158: error: `ClearCommError' undeclared (first use this function)
ソース:ClearCommError(hCom, &dwErrors, &ComStat);

補足日時:2007/09/04 07:41
    • good
    • 0

>全体的にSerial.cc:26: error: 文法エラー before `.' tokenのようなエラーが多いです。


main.ccと同じようなエラーが出てますので、分かる範囲でとりあえずmain.ccにやったのと同じことをまずやってみてください。それでだいぶ減ると思います。
それで残ったやつを潰しましょう。

この回答への補足

できるだけやってみたのですが、やはりどうにもわからないことが多いのでもう少し質問させてください。

まずタイムアウトの設定なんですがWindowsのプログラムでは下記のように設定されています。Linuxにおいてはどのようにタイムアウトを設定すればいいのでしょうか?
GetCommTimeouts(ComFd,&ctmo);
ctmo.ReadIntervalTimeout = 0;
ctmo.ReadTotalTimeoutMultiplier = 10;
ctmo.ReadTotalTimeoutConstant = 50;
ctmo.WriteTotalTimeoutMultiplier = 10;
ctmo.WriteTotalTimeoutConstant = 50;
if(!SetCommTimeouts(ComFd,&ctmo)) return false;

補足日時:2007/09/03 15:13
    • good
    • 0
この回答へのお礼

ありがとうございます。
少し自分で修正してみます。

お礼日時:2007/08/28 00:45

全体的に日本語の文字列でエラーが出てますね。

ソースファイルの文字コードをEUCにすれば解決するかもしれません。
でも、一番簡単な方法は、英数字だけにするのが簡単です。元の分はコメントで残しておいて、英語の文章かローマ字にします。

>とりあえず自分でmakefileを書いてみたのですがmain.ccがコンパイルできないのでそこで止まってます。
>まずmain.ccをコンパイルできるようにするのが第一なのですか?
エラーとmakefileを見せてもらえば答えられると思います。

>また、OpenGLライブラリのリンクはどのようにするんでしょうか?
私はLinuxはコンソール派で、Xウィンドのアプリを書いたことがないのでOpenGLも未経験なんですよ。お役に立てなくて申し訳ない。
ここ↓は参考になりません?
http://www.wakayama-u.ac.jp/~tokoi/opengl/libglu …

この回答への補足

# Makefile

LRF_ver2: main.o Serial.o
g++ -o LRF_ver2 main.o Serial.o

main.o: main.cc
g++ -c main.cc
Serial.o: Serial.cc
g++ -c Serial.cc

main.cc: Serial.h
Serial.cc: Serial.h

どうやらmain.ccのコンパイルは通ったようです。
が、今度はSerial.ccの方でエラーが出てきました。

g++ -c Serial.cc
In file included from Serial.cc:3:
Serial.h:24: error: `BYTE' was not declared in this scope
Serial.h:24: error: 文法エラー before `)' token
Serial.h:26: error: 文法エラー before `)' token
Serial.h:37: error: 'BYTE' is used as a type, but is not defined as a type.
Serial.cc: member function 内の `bool CSerial::InitSerial(char*, int)':
Serial.cc:20: error: 文法エラー before `{' token
Serial.cc: At global scope:
Serial.cc:26: error: 文法エラー before `.' token
Serial.cc:29: error: `ComFd' was not declared in this scope
Serial.cc:29: error: `tio' was not declared in this scope
Serial.cc:29: error: ISO C++ forbids declaration of `tcgetattr' with no type
Serial.cc:29: error: `int tcgetattr' redeclared as different kind of symbol

全体的にSerial.cc:26: error: 文法エラー before `.' tokenのようなエラーが多いです。
こちらの方もよろしければ見ていただけますか?

補足日時:2007/08/27 23:04
    • good
    • 0

地道にエラーを潰していくしか無さそうです。



>main.cc: function 内の `void Write_data(WORD (*)[682])':
>main.cc:203: error: `ZeroMemory' undeclared (first use this function)
>main.cc:203: error: (Each undeclared identifier is reported only
once for each function it appears in.)
ZeroMemory(xx,yy);
は、
memset(xx,0x00,yy);
と書き換えてください。

>main.cc:245:16: 警告: 不明なエスケープシーケンス '\!'
この行は見ないと分かりません。日本語の問題な気がしますが。

>main.cc: function 内の `int main(int, char**)':
>main.cc:247: error: `kDL' undeclared (first use this function)
>main.cc:247: error: 文法エラー before `.' token
>main.cc:247: error: stray '\33' in program
>main.cc:247:67: " 文字での終端を欠いています
>main.cc:248: error: stray '\33' in program
>main.cc:248:41: " 文字での終端を欠いています
>main.cc:251: error: 構文解析エラー before `@' token
>main.cc:251:55: invalid suffix "y" on floating constant
>main.cc:251: error: stray '\33' in program
>main.cc:251: error: stray '\' in program
>main.cc:251:65: " 文字での終端を欠いています
>main.cc:294:53: exponent has no digits
>main.cc:294: error: stray '\33' in program
>main.cc:294:67: " 文字での終端を欠いています
>main.cc:295: error: stray '\33' in program
>main.cc:295:41: " 文字での終端を欠いています
>main.cc:298: error: stray '\33' in program
>main.cc:298: error: stray '\' in program
>main.cc:298:50: " 文字での終端を欠いています
これは、すべてその行を見ないと何とも言えませんね。

>今main.ccだけをコンパイルしているのですが、やはりMakefileなどは書かなくて良いのでしょうか?
main.ccとSerial.ccをリンクするためには、makefileを書かないといけませんね。OpenGLのライブラリのリンクのためにも必要です。

この回答への補足

エラーに対するそれぞれのソースは以下の通りです。

main.cc:247:16: 警告: 不明なエスケープシーケンス '\!' 
          ↓
printf("ポート=%s, ボーレート=%d\n",ComPort, baudrate);

main.cc:249: error: `kDL' undeclared (first use this function)
main.cc:249: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cc:249: error: 文法エラー before `.' token
main.cc:249: error: stray '\33' in program
main.cc:249: error: stray '\33' in program
          ↓
MessageBox(NULL, TEXT("シリアル通信初期化失敗"), TEXT("シリアル通信"), MB_ICONERROR | MB_OK);

main.cc:251: error: 構文解析エラー before `@' token
main.cc:251:47: invalid suffix "y" on floating constant
main.cc:251: error: stray '\33' in program
main.cc:251: error: stray '\' in program
main.cc:251:57: " 文字での終端を欠いています
          ↓
printf("シリアル通信初期化成功!\n");

main.cc:294:54: exponent has no digits
main.cc:294: error: stray '\33' in program
main.cc:294: error: stray '\33' in program
          ↓
MessageBox(NULL, TEXT("シリアル通信後始末失敗"), TEXT("シリアル通信"), MB_ICONERROR | MB_OK);

main.cc:296: error: stray '\33' in program
main.cc:296: error: stray '\' in program
main.cc:296:50: " 文字での終端を欠いています
          ↓
printf("シリアル通信終了!\n");

とりあえず自分でmakefileを書いてみたのですがmain.ccがコンパイルできないのでそこで止まってます。
まずmain.ccをコンパイルできるようにするのが第一なのですか?
また、OpenGLライブラリのリンクはどのようにするんでしょうか?

補足日時:2007/08/27 22:04
    • good
    • 0

>COMMTIMEOUTS ctmo;についてはどのようにすればいいのでしょうか?


>ソースではGetCommState(hCom, &dcb);はこの一行のみ書かれていました。
>これはこのままでいいのでしょうか?
とりあえず、Linuxにない関数はコメントアウトしておいてください。
実際に動かしてみないと問題が出てこない可能性があります。

>あとdcb.BaudRate = CBR_115200;やdcb.ByteSize = 8;といった記述があるのですがこれはdcbをtioに代えればいいのでしょうか?
そうです。tioに置き換える必要があります。

>ソースコードを書き直してもコンパイルしたときのエラーに何も変化はなかったのですが、これで問題がないのか、あるいは実行したときでないとどういう問題が起こるかわからないのでしょうか?
エラーに変化がないですか?まだエラーが出てますか?
追加インクルードは追加してもらえました?
もし、それでも出てくるエラーがあるならここに貼り付けてみてください。
エラーのレベルによってはコンパイルが完了せず実行ファイルが出来ていない可能性がありますが、実行ファイルは出来ているのでしょうか?

この回答への補足

HANDLEやDCBに関するエラーは無くなりました。
追加インクルードは追加しました。
まだでてくるエラーは以下のものです。

main.cc: function 内の `void Write_data(WORD (*)[682])':
main.cc:203: error: `ZeroMemory' undeclared (first use this function)
main.cc:203: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cc:245:16: 警告: 不明なエスケープシーケンス '\!'
main.cc: function 内の `int main(int, char**)':
main.cc:247: error: `kDL' undeclared (first use this function)
main.cc:247: error: 文法エラー before `.' token
main.cc:247: error: stray '\33' in program
main.cc:247:67: " 文字での終端を欠いています
main.cc:248: error: stray '\33' in program
main.cc:248:41: " 文字での終端を欠いています
main.cc:251: error: 構文解析エラー before `@' token
main.cc:251:55: invalid suffix "y" on floating constant
main.cc:251: error: stray '\33' in program
main.cc:251: error: stray '\' in program
main.cc:251:65: " 文字での終端を欠いています
main.cc:294:53: exponent has no digits
main.cc:294: error: stray '\33' in program
main.cc:294:67: " 文字での終端を欠いています
main.cc:295: error: stray '\33' in program
main.cc:295:41: " 文字での終端を欠いています
main.cc:298: error: stray '\33' in program
main.cc:298: error: stray '\' in program
main.cc:298:50: " 文字での終端を欠いています

コンパイルしましたが実行ファイルはできていません。
元のプログラムはmain.cc、Serial.h、Serial.ccという3つのファイルでできているみたいなのですが、シリアルポート関係の関数は全てSerial.ccで記述されていて、main.ccでは関数を呼び出しているだけのようです。
今main.ccだけをコンパイルしているのですが、やはりMakefileなどは書かなくて良いのでしょうか?

補足日時:2007/08/27 19:08
    • good
    • 0

私もLinuxでのシリアルポート操作はやったことがないのでヒント程度になりますが、ご了承ください。

完璧な自信はないです。

追加するインクルード。
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>

HANDLE hCom;

int ComFd;

DCB dcb;

struct termios tio;

>hCom = CreateFile(comport, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

if((ComFd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK))<0) {
//エラー処理
}

>GetCommState(hCom, &dcb) ;
tcgetattr ( ComFd, &tio );

GetCommState後のプログラムの操作が書かれていなかったので、ここを参考に修正してください。
http://komatta.astron.s.u-tokyo.ac.jp/~kato/othe …
シリアルポートのパラメータが良くわからなかったら元のプログラムの操作を教えてもらえば、例は書けると思いますが最終的に動作のデバッグをする本人が理解しないと後で苦労することになると思います。

>SetCommState(hCom, &dcb);
tcsetattr(ComFd, TCSANOW, &tio);

>GetCommTimeouts(hCom,&ctmo);
>SetCommTimeouts(hCom,&ctmo);
該当するLinuxの関数を探せませんでした。タイムアウト時間に関する操作のための関数です。とりあえず、設定しなくても動くと思います。

>PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
tcflush(ComFd, TCIOFLUSH);//入出力バッファをクリアします。

>CloseHandle(hCom)
close(ComFd);

>WriteFile(hCom, &data, sizeof(BYTE), &byte, NULL)
byte = write(ComFd, &data, sizeof(BYTE));

>WriteFile(hCom, data, size, &byte, NULL)
byte = write(ComFd, data, size);


>ReadFile(hCom, &data, 1, &byte, NULL);
byte = read(ComFd,&data,1);

>ReadFile(hCom, data, size, &byte, NULL);
byte = read(ComFd,data,size);

>ClearCommError(hCom, &dwErrors, &ComStat);
エラー処理に関わる関数だと思うのですが、該当するLinuxの関数を探せませんでした。Windowsで、この関数を使ったことがないので良くわかりません(^^ゞ

>PurgeComm(hCom, PURGE_RXABORT | PURGE_RXCLEAR);
tcflush(ComFd, TCIFLUSH);//入力バッファをクリアします。

この回答への補足

ありがとうございます。

COMMTIMEOUTS ctmo;についてはどのようにすればいいのでしょうか?
ソースではGetCommState(hCom, &dcb);はこの一行のみ書かれていました。
これはこのままでいいのでしょうか?
あとdcb.BaudRate = CBR_115200;やdcb.ByteSize = 8;といった記述があるのですがこれはdcbをtioに代えればいいのでしょうか?

ソースコードを書き直してもコンパイルしたときのエラーに何も変化はなかったのですが、これで問題がないのか、あるいは実行したときでないとどういう問題が起こるかわからないのでしょうか?

質問攻めになってしまいましたがどうぞよろしくお願いします。

補足日時:2007/08/27 17:34
    • good
    • 0

あっ間違ってました。

つづりと型を。
typedef unsigned short WORD;
に訂正します。それと
typedef unsigned int DWORD;
を追加してください。
これで今まで出てきた中のシリアルポート以外は解決すると思います。

使っているシリアルポート関係の関数を教えてもらえますか?
参考↓シリアルポート制御に使う関数。
http://d.hatena.ne.jp/paruto/20060228
使われている関数と使われているパラメータをすべて教えてください。
代替のLinux関数を書きますので。

この回答への補足

ありがとうございます。

シリアルポート関係で使われている関数は以下の通りです。
hCom = CreateFile(comport, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
GetCommState(hCom, &dcb) ;
SetCommState(hCom, &dcb);
GetCommTimeouts(hCom,&ctmo);
SetCommTimeouts(hCom,&ctmo)
PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
CloseHandle(hCom)
WriteFile(hCom, &data, sizeof(BYTE), &byte, NULL)
WriteFile(hCom, data, size, &byte, NULL)
ReadFile(hCom, &data, 1, &byte, NULL);
ReadFile(hCom, data, size, &byte, NULL);
ClearCommError(hCom, &dwErrors, &ComStat);
urgeComm(hCom, PURGE_RXABORT | PURGE_RXCLEAR);

これで良かったのでしょうか?
どうぞよろしくお願いします。

補足日時:2007/08/26 07:33
    • good
    • 0

一筋縄では解決しなさそうです。

やっかいな問題がいくつか出てきています。

>Serial.h:19: error: 文法エラー before `*' token
>Serial.h:20: error: 文法エラー before `)' token
これだけだと分からないですね。19,20行目の内容が見たいです。

>Serial.h:24: error: 'HANDLE' is used as a type, but is not defined as a type.
WindowsAPIのハンドルの用ですが、何に使っているものか分からないと代替案は出せませんね。ヘッダよりも使っているソースコード側が問題となります。

>Serial.h:25: error: 'DCB' is used as a type, but is not defined as a type.
DCB構造体ですか?シリアルポートの制御を行う場合に必要な構造体ですが。シリアルポートを使われてますか?上のハンドルとも関係しそうですね。

>Serial.h:26: error: 'BOOL' is used as a type, but is not defined as a type.
これは自前で定義します。
typedef int BOOL;
で大丈夫だと思います。

>Serial.h:28: error: 'COMMTIMEOUTS' is used as a type, but is not defined as a type.
これもシリアルポート関係です。

>main.cc:18:18: glut.h: そのようなファイルやディレクトリはありません
これはOpenGLのヘッダですね。OpenGLには詳しくないのですが、インストールされていないか、パスの見えるところにヘッダが存在しないものと
思われます。
include <GL/glut.h>
で通る場合もあるようです。

>main.cc:22: error: 文法エラー before `[' token
>main.cc:23: error: 文法エラー before `[' token
これだけだと分からないですね。22,23行目の内容が見たいです。

>main.cc:30: error: `WORD' was not declared in this scope
>main.cc:30: error: 文法エラー before `[' token
これもLinuxでは無いので、
typedef uisigned int WORD;
と定義します。


>main.cc: function 内の `void idle()':
>main.cc:35: error: `glutPostRedisplay' undeclared (first use this function)
>main.cc:35: error: (Each undeclared identifier is reported only once for each function it appears in.)
>main.cc: function 内の `void display()':
>main.cc:40: error: `g_distance' undeclared (first use this function)
>main.cc:48: error: `GL_COLOR_BUFFER_BIT' undeclared (first use this function)
>main.cc:48: error: `glClear' undeclared (first use this function)
>main.cc:49: error: `glColor3d' undeclared (first use this function)
>main.cc:50: error: `GL_MODELVIEW' undeclared (first use this function)
>main.cc:50: error: `glMatrixMode' undeclared (first use this function)
>main.cc:51: error: `glLoadIdentity' undeclared (first use this function)
>main.cc:67: error: `GL_LINES' undeclared (first use this function)
>main.cc:67: error: `glBegin' undeclared (first use this function)
>main.cc:68: error: `glVertex2d' undeclared (first use this function)
>main.cc:70: error: `glEnd' undeclared (first use this function)
>main.cc:92: error: `GL_LINE_STRIP' undeclared (first use this function)
>main.cc:125: error: `glutSwapBuffers' undeclared (first use this function)
glut.hをインクルードできれば解決すると思います。

この回答への補足

ありがとうございます。
ご指摘の通り修正しましたところ、だいぶエラーが減りました。
OpenGL関係のエラーがたくさんありました。
それでもまだまだエラーがありますのでよろしくお願い致します。

Serial.h:22: error: 文法エラー before `*' token
Serial.h:23: error: 文法エラー before `)' token
の部分ですがソースでは
DWORD Read2(void* data, int size);
DWORD CheckSerialData(void);
のようになっていました。


>DCB構造体ですか?シリアルポートの制御を行う場合に必要な構造体ですが。シリアルポートを使われてますか?上のハンドルとも関係しそうですね。

シリアルポートを使っています。おそらくDCB構造体だと思われます。
hComはどうやらポートのハンドル(?)を示しているようです。
以下のように使われています。
GetCommState(hCom, &dcb);
        ↑  ↑
       HANDLE DCB

GetCommTimeouts(hCom,&ctmo);
             ↑
           COMMTIMEOUTS


main.cc:23: error: 文法エラー before `[' token
main.cc:24: error: 文法エラー before `[' token
の部分は
WORD g_distance[1][682];
WORD save_distance[SAVE_SIZE][682];
のようになっていました。

補足日時:2007/08/25 04:52
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています