• ベストアンサー

windowsでLinuxで作成したソースをコンパイル

Linuxで作成、 $gcc -Wall file.c で、通ったファイルをWindowsでも同様に通したいので、MinGWを使って、コンパイルしたのですが、 #include <sys/socket.h> の構文で引っかかってしまいました。どうやらインクルードファイルが無いようでしたので、 C:\MinGW\include C:\MinGW\lib 以下に、Linuxの /usr/include/ /usr/lib/ 以下のファイルをそのまま入れて、再度実行しました。 ヘッダーファイルは見つけて読んでくれたのですが、そのヘッダーファイルに書いてある関数(例:htons(), socket(), inet_addr(), connect())が参照できないとの事で、怒られてしまいます。 Linuxのライブラリファイルをそのまま入れたのがまずかったのかもしれないのですが、こいつのエラーを解消する有効手段が見つかりません。 問題解決のヒント、又は答えを教えていただけませんでしょうか。 どうか、お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.4

Unix と Windows ネイティブな環境では基本的にヘッダファイルやライブラリの構造が、基本骨格 (いわゆる、stdio.h や stdlib.h などに含まれている関数) を除いては大きく異なっているので、Unix でコンパイルできたプログラムが必ずしも Windows でコンパイルし、実行できるわけではありません。(もちろん、その逆も当てはまります) MinGW は Windows ネイティブな実行プログラムを作成するものなので、MinGW でコンパイルする場合はちゃんと Windows 用のプログラムとして書かなければなりません (#2の方が書かれているように、socket.h ではなく、winsock2.h を使用するなど)。もし、Unix にのみ対応したプログラムを Windows 上で動かしたいと言うことであれば、Cygwin (要するに Unix 関数の処理を Windows ネイティブな処理に変換するエミュレータ) を利用する必要があります。

user_localhost
質問者

お礼

問題解決以外の事でも勉強になりました。ご回答くださりありがとうございます。 ご返答が遅くなってしまい申し訳ありませんでした。

その他の回答 (3)

回答No.3

Cygwin の環境の中でコンパイルしてみたらどうでしょうかね。(ネットワーク関係は多分同じじゃないかな?)

参考URL:
http://www.cygwin.com/
user_localhost
質問者

お礼

ありがとうございます。早速試してみます。 ご回答くださったのに返答が遅くなり、申し訳ありません。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

winsock2.h を使うように修正する、かな。

user_localhost
質問者

お礼

回答ありがとうございます。 最終的に、サーバープログラムをLinuxで、クライアントプログラムをWindowsで作成して管理していくつもりですが、外部からアクセスできるか実験してみたかったので、諸事情により、自宅にいながら外部から一番簡単な方法でアクセスする方法がWindowsでしかなかったので、このような回りくどい方法を取っております。  あと1日くらい、無い知恵を絞り、問題解決に取り組もうと思います

  • AnalHare
  • ベストアンサー率8% (9/110)
回答No.1

クロスプラットフォーム対応のツールでナイトむりぽ。 そうでなければ、それぞれのプラットフォームで動くように ソース改変後こんぱいるしてみてくり

user_localhost
質問者

お礼

ありがとうございます。クロスプラットフォームという、一つの答えにたどり着くことができました。

関連するQ&A

  • Cプログラム UDP送信の送信データに関して

    以下の2つのプログラムでの質問なのですが、 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5", 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } と #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } について、送信データ部分に「¥」入ることによって、送信プロセスでどのような処理がなされているのですか? ¥~¥までで1バイトということで処理してくださいね、と処理系?に指示しているのですか? また、「¥」はC言語ならではの表記の仕方なのですか?少し、伝えるのが難しいですが、何でもいいのでご回答頂けませんか?宜しくお願いします。

  • ctime_r宣言が無いのに何故かコンパイルが通る

    MinGW 5.1.3 (Full Install) で以下のソースをコンパイルしたところ、ctime_rが何処にも宣言されていないのに何故かコンパイルが通りました。 /* a.c */ #include <time.h> int main() {  //(実行エラーにはなるはずだが、コンパイルは出来るはず)  ctime_r(NULL, NULL);  return 0; } $ gcc -v -c a.c Reading specs from C:/MyPrograms/MinGW/lib/gcc/mingw32/3.4.2/specs Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug Thread model: win32 gcc version 3.4.2 (mingw-special) cc1 -quiet -v -iprefix C:\MyPrograms\MinGW\bin\../lib/gcc/mingw32/3.4.2/ a.c -quiet -dumpbase a.c -auxbase a -version -o ./ccyAbaaa.s ignoring nonexistent directory "C:/MyPrograms/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../mingw32/include" ignoring nonexistent directory "/mingw/include" ignoring nonexistent directory "/mingw/include" ignoring nonexistent directory "/mingw/lib/gcc/mingw32/3.4.2/include" ignoring nonexistent directory "/mingw/mingw32/include" ignoring nonexistent directory "/mingw/include" #include "..." search starts here: #include <...> search starts here: C:/MyPrograms/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include C:/MyPrograms/MinGW/bin/../lib/gcc/mingw32/3.4.2/include End of search list. GNU C version 3.4.2 (mingw-special) (mingw32) compiled by GNU C version 3.4.2 (mingw-special). GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 as -o a.o ./ccyAbaaa.s ところがリンクはエラーになります。 $ gcc -v a.o (略) ld -Bdynamic C:/MyPrograms/MinGW/lib/crt2.o C:/MyPrograms/MinGW/lib/gcc/mingw32/3.4.2/crtbegin.o -LC:/MyPrograms/MinGW/lib/gcc/mingw32/3.4.2 -LC:/MyPrograms/MinGW/lib/gcc -LC:/MyPrograms/MinGW/mingw32/lib -LC:/MyPrograms/MinGW/lib a.o -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt C:/MyPrograms/MinGW/lib/gcc/mingw32/3.4.2/crtend.o a.o:a.c:(.text+0x3a): undefined reference to `ctime_r' なぜコンパイルはできるんだろうと思ったのですが、やはりインクルードパスにあるヘッダ群に ctime_r らしきものはやはり見当たりません。 $ find . -type f | xargs grep "ctime_r" $ find C:/MyPrograms/MinGW/include -type f | xargs grep "ctime_r" $ find C:/MyPrograms/MinGW/lib/gcc/mingw32/3.4.2/include -type f | xargs grep "ctime_r" $ なぜコンパイルが通っているのでしょうか? [補足] このテストを行う前に GnuWin32 の libgw32c(glibc互換ライブラリで、この中のtime.hはctime_rを含む) をインストールしてコンパイル&リンクを試みましたが、やはりリンクエラーが出ていました $ gcc -I/path/to/glibc a.c -lgw32c undefined reference to `ctime_r' 今回の質問のテストを行う前にlibgw32cライブラリはアンインストールしています。

  • 実行ファイルのweb掲載可否

    以下のプログラムの実行ファイルをweb上に載せることはできるのでしょうか? #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); char data[] = { 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x44, 0x33, 0x05 }; sendto(sock, data, 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

  • C言語エラーの解決法教えてください。

    以下のプログラムで6行目にこのようなエラー表示がでてきたのですが、どうすれば良いですか? 1 IntelliSense: 識別子 "WSAData" が定義されていません 2 IntelliSense: 識別子 "wsaData" が定義されていません #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData; wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(9750); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.8 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } 教えてください。宜しくお願いします。

  • C言語開発環境について

    このプログラムを実行出来るコンパイラ?あるいは開発環境を紹介して頂けませんか?出来れば無償版がいいです。よろしくお願い致します。 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3"); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

  • FFTWでコンパイルができません。

    FFTWでコンパイルができません。 http://www32.atwiki.jp/amaeda/pages/12.html ↑のソースファイルをコンパイルすると以下のエラーが出ます。↓ >gcc -o fftw1D fftw1D.c -lfftw3 -lm (MinGW) c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: cannot find -lfftw3 collect2: ld returned 1 exit status FFTWはわからないので、教えてください。

  • linuxの/usr/includeについて

    (1)gccは、オプションを指定しないで、/usr/include以外のヘッダーファイルを見に行きますか? (2)/usr/includeの中はディストリビューションによって異なりますか? (3)/usr/includeはアプリケーションなどをインストールしたりして、増えたりするものなんでしょうか?

  • Linux C言語開発 インクルードについて

    C言語開発初心者です。 LinuxでC言語開発をするにあたり、どのディストリビューションにしても インクルードしたいヘッダファイルが既定の場所には無く別の場所にカーネルのバージョンごとに保存されているようなのです。 このままコンパイルを試みるとインクルードファイルが存在しませんとエラーが返ります。 既定のヘッダファイルの保存場所にはC言語開発に必要なヘッダファイルが存在しませんので、この問題を皆さんはどのように解決しておりますか?どなたかご教授お願いいたします。 C言語でincludeする場所は<>でくくった場合 /usr/include/ 以下を参照する設定になっていると思うのですが、 例えばmodule.h やinit.h などの開発用ヘッダファイル?を探してみると /usr/include/linux/ には存在せず、 find / -name module.h と入力して検索してみると /usr/src/kernels/2.6.32-131.21.1.el6.i686/include/linux/module.h と別な場所にあります。 ネットであれやこれや調べてみても コンパイル時にincludeの参照先を指定する方法はあるようなのですが、 コンパイルする度にいちいち指定するのは面倒だと思います。(gcc -I) かといって開発しているカレントディレクトリにヘッダファイルをコピーしても includeするヘッダファイルが別のヘッダファイルを参照することもあるようなので、 あまり現実的ではないようです。 一番安全な方法としてincludeする参照先が環境変数か何かで追加及び変更するのではないかと思います。 試してみましたがenvコマンドで表示されるOSの環境変数とは別のもののようなのです。 環境変数 C_INCLUDE_PATH とはどのようにして変更・追加するのでしょう? また、上記の方法以外で良い方法がございましたらそれでもかまいません。 よろしくお願いいたします。 開発環境 ・OS centos6 ・以下のパッケージはインストール済み kernel-headers-2.6.32-131.21.1.el6.i686 kernel-devel-2.6.32-131.21.1.el6.i686 make-3.81-19.el6.i686 gcc-4.4.5-6.el6.i686 ・GUI開発環境 netbeans ・uname -r 実行結果 2.6.32-131.21.1.el6.i686

  • MinGWをXPにインストール後 DOSのipconfig など使えな

    MinGWをXPにインストール後 DOSのipconfig など使えなくなる 標記の通り、昨日MinGWというC言語の環境をインストールした。 それに応じてシステムの環境関数もいくつか追加した。下記: 1 MINGW_PATH=G:\MinGW 2 C_INCLUDE_PATH=%MINGW_PATH%\include;%MINGW_PATH%\lib\gcc\mingw32\3.4.5\include 3 CPLUS_INCLUDE_PATH=%MINGW_PATH%\include\c++\3.4.5;%MINGW_PATH%     \include\c++\3.4.5\mingw32;%MINGW_PATH%\include\c++\3.4.5backward;%C_INCLUDE_PATH% 4 LIBRARY_PATH=%MINGW_PATH%\lib;%MINGW_PATH%\lib\gcc\mingw32\3.4.5 5 PATH=%MINGW_PATH%\bin;%MINGW_PATH%\libexec\gcc\mingw32\3.4.5 そうしてから、DOSでipconfig 出来なくなるだけじゃなく、社内用のメールボクスも開けなくなる。 一体なぜか? どなたか教えていただきませんか

  • UDPデータ受信について

    以下でデータを送信すると、直ぐに0x42,0x42,0x00,0x00,0x00,0x00,0x82,0x00,0x01,0x44,0x33,0x00の12バイトのデータを送り返してくるのですが、これを送り返してきたら、数字の1を表示するように以下のプログラム内に書き込むことは出来ませんでしょうか?ご教授お願いします。 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); char data[] = { 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x44, 0x33, 0x05 }; sendto(sock, data, 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }