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

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

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

標準C++の範囲で書かれたプログラムであれば、ほぼコンパイルしなおすだけです。

(Makefileを書き直す等は必要ですが...)
標準外の記述が含まれていれば、ほぼその部分すべての書き換えが必要になります。ただし、Boost C++ LibrariesやQtなど、クロスプラットフォームのライブラリを用いていた場合は、状況がかなりましになります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
おそらく標準C++の範囲で書かれたものだと思うですが・・・
そもそもMakefileの書き方も分かっていないくらいのレベルですので。
その辺りは自分でググって勉強しようと思います。ありがとうございます。

お礼日時:2007/08/06 20:15

> おそらく標準C++の範囲で書かれたものだと思うですが・・・



もしそのプログラムがGUIを使っていて、しかも簡単にビルドができるようであれば、かなり絶望的な状況が待っていると思います。
コマンドプロンプト上で動作するものであれば、まだ見込みがあります。

一度ソースファイルを覗いてみて、
#include "StdAfx.h" とか LPCTSTR とか TCHAR とかの記述がないか探してみてください。もし見つかるようだと、移植は確実に難航します。
    • good
    • 0
この回答へのお礼

GUIは使っていません。コマンドプロンプト上で動作するものです。
#include "StdAfx.h"やLPCTSTRやTCHARといった記述はありませんでした。

OpenGLは使っているようですがこれは問題ないでしょうか?
#include <windows.h>とあるのですが移植するときこの辺りはどう変えればいいのでしょうか?

お礼日時:2007/08/06 23:56

> OpenGLは使っているようですがこれは問題ないでしょうか?



OpenGLを使ってGUIなしなのでしょうか?

> #include <windows.h>とあるのですが移植するときこの辺りはどう変えればいいのでしょうか?

どんな使い方をしているかによります。
先に書いた LPCTSTRやTCHAR は、比較的よく使われる環境依存の型名ですが、Windows APIに依存したコードがある場合には移植が難航するという点では同じです。
    • good
    • 0
この回答へのお礼

どういったらいいんでしょうか。
OpenGLはグラフを表示するためだけに使われています。
バリバリのGUIといった感じではありません。
もう一度プログラムを見てみましたがLPCTSTRやTCHARといった記述はありませんでした。

この場合Makefileを書き直せばうまくいきそうですか?

お礼日時:2007/08/07 10:32

> OpenGLはグラフを表示するためだけに使われています。



そのグラフはどうやって表示しているのでしょうか?
例えば * を並べて棒グラフを作るように、文字情報をコンソールに出力しているだけでしょうか? それならまあ問題ないでしょう。

> もう一度プログラムを見てみましたがLPCTSTRやTCHARといった記述はありませんでした。

Windows APIや関連する型・マクロなどはなかったでしょうか?
大文字で始まる関数や、FILE型以外の大文字で始まる型名があると、面倒なことになります。
手っ取り早く判断するには、#include <windows.h> の箇所をコメントアウトして、ビルドできるかどうか調べることです。

> この場合Makefileを書き直せばうまくいきそうですか?

上記しだいです。
    • good
    • 0
この回答へのお礼

返事が遅くなりすみません.
文字情報を出力しているのではなく,点をプロットしている感じです(おそらく).
#include<windows.h>をコメントアウトしてのビルドはできました.
が,警告がいくつかでました.

お礼日時:2007/08/10 03: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

OpenGLは使ったことがありませんが、プラットフォーム共通のライブラリ


のようですので、OpenGLベースのアプリケーションなら特別なことを
せずとも移植可能のようです。同一ソース化もできるようです。

参考URL:http://www.geocities.co.jp/SiliconValley/7406/ti …
    • good
    • 0
この回答へのお礼

回答ありがとうございます.
また,返事が遅くなりすみません.
OpenGLは結果を表示するのに使用しているのでOpenGLベースかどうかはわかりません.
OpenGLだとWindows,Linux関係なく使えるようですね.

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

> Linuxの環境で#include <windows.h>をコメントアウトしてコンパイルしてみたところエラーがたくさん出てきました.



どんなエラーが出たのか、メッセージをそのまま補足してください。
余りにも多い場合は、最初のいくつかだけでもかまいません。

> OpenGLだとWindows,Linux関係なく使えるようですね.

そんなに甘くはありません。
十分配慮すれば、共通のソースを記述できるというだけで、OpenGLを使えば無条件に移植性が得られるわけではありません。

この回答への補足

少し家を離れていたもので返事が遅くなり申し訳ないです。
エラーが非常に多かったので最初の数行だけ抜き出しました。

main.cc:7:18: conio.h: そのようなファイルやディレクトリはありません
main.cc:8: error: 'BYTE' is used as a type, but is not defined as a type.
main.cc:11 から include されたファイル中:
Serial.h:1:9: 警告: #pragma once はもう使われていません
Serial.h:3:21: windows.h: そのようなファイルやディレクトリはありません
In file included from main.cc:11:
Serial.h:13: error: `BYTE' was not declared in this scope

Serial.hというのはこちらで作ったヘッダーファイルのようです。
お時間があればよろしくお願いします。

補足日時:2007/08/22 17:38
    • good
    • 0

#5のzwiです。



>main.cc:7:18: conio.h: そのようなファイルやディレクトリはありません
Linuxにconio.hは無いですね。getch()関数を使っていた場合は、私は使ったことが無いのですがcursesライブラリに代替できるものがあるようです。申し訳ないのですが詳しく無いのでこれ以上は説明できません。

>main.cc:8: error: 'BYTE' is used as a type, but is not defined as a type.
Linuxには定義してあるヘッダがありませんので、typedef unsigned char BYTE;をヘッダ定義してください。

>main.cc:11 から include されたファイル中:
>Serial.h:1:9: 警告: #pragma onceはもう使われていません
gccのバージョンによっては使えるみたいです。
代替として,
#ifndef __SERIAL_H__
#define __SERIAL_H__
<元のヘッダの中身>
#endif
に置き換えるという手段があります。

>Serial.h:3:21: windows.h: そのようなファイルやディレクトリはありませんIn file included from main.cc:11:
これは無いので削除してください。

>Serial.h:13: error: `BYTE' was not declared in this scope
BYTEは上で書いたのと同様です。

エラーの種類がこれだけだとは思えません。
まだ他のタイプがあるんじゃないでしょうか?

この回答への補足

回答ありがとうございます。
指摘されたところを修正してみました。
前回出たエラーは無くなったようです。前回のものは最初の数行でしたので残りの部分も載せてみます。すこし多いのですがお願いします。

Serial.h:19: error: 文法エラー before `*' token
Serial.h:20: error: 文法エラー before `)' token
Serial.h:24: error: 'HANDLE' is used as a type, but is not defined as a type.
Serial.h:25: error: 'DCB' is used as a type, but is not defined as a type.
Serial.h:26: error: 'BOOL' is used as a type, but is not defined as a type.
Serial.h:28: error: 'COMMTIMEOUTS' is used as a type, but is not defined as a type.
main.cc:18:18: glut.h: そのようなファイルやディレクトリはありません
main.cc:22: error: 文法エラー before `[' token
main.cc:23: error: 文法エラー before `[' token
main.cc:30: error: `WORD' was not declared in this scope
main.cc:30: error: 文法エラー before `[' token
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)
main.cc: function 内の `void init()':

補足日時:2007/08/24 15:22
    • 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

あっ間違ってました。

つづりと型を。
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

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