none
【VisualStudio2017】【クロスコンパイル】【Linux】C++によるLinux開発の環境において、sys/socket.h等のパスが見つからないのですが、対応方法はあるのでしょうか?

    質問

  • VisualStudio2017で、C++によるLinux開発がサポートされ、簡単なコンソールプログラム等は、リモートデバッグ含め、Linuxカーネルでの動作が出来る事は確認出来たのですが、Linux環境下でビルド、実行確認出来ているソースをVisualStudio環境に持ってきたとき、sys/socket.h等、sys/***.h関連が見つからない様で、エラーとなります。

    VisualStudioインストール時に「その他のツールセット」カテゴリの「C++によるLinux開発」にチェックを入れ、オプションは「Vsual C++ tools for CMake and Linux」、「Embedded開発とlot開発」にもチェックを入れてインストール済みの環境です。

    Linux(gcc)クロスコンパイル環境構築において、抜けている手順等があったのでしょうか?

    お心当たりあれば助言お願いします。

    2018年3月5日 6:27

回答

  • 「sys/socket.h等、sys/***.h関連が見つからない様で、エラーとなります。」
    エラーの内容をもう少し詳しく(正確に)書かれるとわかるかたがいると思います。

    http://gmagazine00.blog115.fc2.com/blog-entry-36.html
    にあったコードをコピーして試してみました。
    プロジェクト名:testtcpclient(Windows Subsystem for Linux を使用)

    こんな状態でもビルドすると

    できあがっていて、動作します。
    linux側(Ubuntuです)で、
    [省略]:~$ cd projects/testtcpclient/bin/x64/Release
    [省略]:~/projects/testtcpclient/bin/x64/Release$
    [省略]:~/projects/testtcpclient/bin/x64/Release$ ./testtcpclient.out
    [省略]:~/projects/testtcpclient/bin/x64/Release$ cd ~
    (私の方のセッティングもおかしいのでしょうけれど。)

    • 回答としてマーク tty_yamamoto 2018年3月7日 1:08
    2018年3月6日 11:12

すべての返信

  • 「sys/socket.h等、sys/***.h関連が見つからない様で、エラーとなります。」
    エラーの内容をもう少し詳しく(正確に)書かれるとわかるかたがいると思います。

    http://gmagazine00.blog115.fc2.com/blog-entry-36.html
    にあったコードをコピーして試してみました。
    プロジェクト名:testtcpclient(Windows Subsystem for Linux を使用)

    こんな状態でもビルドすると

    できあがっていて、動作します。
    linux側(Ubuntuです)で、
    [省略]:~$ cd projects/testtcpclient/bin/x64/Release
    [省略]:~/projects/testtcpclient/bin/x64/Release$
    [省略]:~/projects/testtcpclient/bin/x64/Release$ ./testtcpclient.out
    [省略]:~/projects/testtcpclient/bin/x64/Release$ cd ~
    (私の方のセッティングもおかしいのでしょうけれど。)

    • 回答としてマーク tty_yamamoto 2018年3月7日 1:08
    2018年3月6日 11:12
  • ご解答ありがとうございます。

    どうも、標準インクルードファイルは、インクルードVisualStudio2017の入っているPC側に無くても、リモートビルドマシン側にあれば問題無いようですね。

    ただ、Visualstudio側にソースが無い場合は「ソースファイルが開けません」のエラーになるようです。(リモートビルドマシンでは正常にビルド完了しているのですが)

    エラーを回避するために標準インクルードフォルダにgccのインクルードフォルダをまるごとコピーしたフォルダを追加して当面の問題を回避(先送り?)しています。

    少し悩んだのが追加のインクルードとライブラリに関してだったのですが、プロジェクトソースフォルダから追加インクルード、ライブラリを相対パスで指定しておけば、リモートビルドマシンにファイルがコピーされ、ビルドが出来る事は確認出来ました。

    ご協力ありがとうございました。

    • 回答としてマーク tty_yamamoto 2018年3月7日 1:08
    • 回答としてマークされていない tty_yamamoto 2018年3月7日 1:09
    2018年3月7日 1:08
  • 環境構築の際、/usr/include以下一式をコピーするよう紹介されています。

    正しく構築されれば、IntelliSenseはgccを前提としてヘッダー解析等を行ってくれます。

    2018年3月7日 1:32
  •  tty_yamamotoさんは すでに/usr/includeディレクトリをコピーして使われているようですので、このスレッドで恩恵を受けたのは私かも。

    linuxディレクトリをWindowsにコピーするといっても "Windows Subsystem for Linux”の場合は黒いターミナルで操作するようですので 困りました。(ふつうにインストールされたlinuxだと usbメモリでもFTPでも使えばいいのですが。)

    マウント方式 (linux側から)]
    これが非常に簡単なのですが。
    Windowsのドライブは既にマウントされてしまっていますので、Cドライブなら /mnt/cで使えます。
    まず サイズを調べる
    $ du -hs /usr/include
    18M     /usr/include
    {予めWindows側で Eドライブに\ubuntu\usrフォルダを作っておく}
    $ cp -R /usr/include /mnt/e/ubuntu/usr

    pscp方式(Windows側から)]
    佐祐理さんがリンクされていた所の方式です。
    (pscp.exeはダウンロードして C:\bin\pscpに置く。)
    {予めlinux側でsshを起動させておく}
    $ service ssh status
     * sshd is not running
    $ sudo service ssh start
    [sudo] password for irohaniho:
     * Starting OpenBSD Secure Shell server sshd      [ OK ]
    {ここからWindows側で。C:\bin\pscp\ubuntu\usrフォルダを作っておく}
    C:\bin\pscp> pscp -r irohaniho@localhost:/usr/include ./ubuntu/usr
    irohaniho@localhost's password:

    結果
    /usr/include  (ディレクトリ数:109, ファイル数:1927)
    e:\ubuntu\usr\include,  (フォルダー数: 108、ファイル数: 1,929)
    c:\bin\pscp\ubuntu\usr\include,  (フォルダー数: 154、ファイル数: 2,635)
    {$ ls -l /usr/include/c++/
    total 0
    drwxr-xr-x 0 root root 4096 Mar  6 15:20 5
    lrwxrwxrwx 1 root root    1 Feb  6 13:22 5.4.0 -> 5
    5 というディレクトリは(フォルダー数:43、ファイル数:693)で、
    5.4.0 はそのシンボリックリンクですがpscpがフォルダとしてコピーしています。}

    その他気になったところは、
    pscpでは、元のip6t_hl.h(395B), ip6t_HL.h(345B)の内、ip6t_HL.h(395)が残っています。
    (つまり、ip6t_hl.h(395B)  -->  ip6t_HL.h(395B))
    (この大文字小文字の二重ファイル名は 7件位あります。)

    ありがとうございます。

    [追加]2018-03-10 Sat. 15:32
    1. 重複は以下の8件、
    /usr/include/linux/netfilter/xt_CONNMARK.h  (691B)
              〃/xt_connmark.h  (136B)
    /usr/include/linux/netfilter/xt_DSCP.h  (634B)
              〃/xt_dscp.h  (638B)
    /usr/include/linux/netfilter/xt_MARK.h  (121B)
              〃/xt_mark.h  (197B)
    /usr/include/linux/netfilter/xt_RATEEST.h  (305B)
              〃/xt_rateest.h  (774B)
    /usr/include/linux/netfilter/xt_TCPMSS.h  (172B)
              〃/xt_tcpmss.h  (190B)
    /usr/include/linux/netfilter_ipv4/ipt_ECN.h  (838B)
              〃/ipt_ecn.h  (368B)
    /usr/include/linux/netfilter_ipv4/ipt_TTL.h  (312B)
              〃/ipt_ttl.h  (368B)
    /usr/include/linux/netfilter_ipv6/ip6t_HL.h  (345B)
              〃/ip6t_hl.h  (395B)

    2. シンボリックリンクが 2つあって、
    lrwxrwxrwx   /usr/include/c++/5.4.0 -> 5
    lrwxrwxrwx   /usr/include/x86_64-linux-gnu/c++/5.4.0 -> 5
    マウント方式で Windows側にコピーされた 5.4.0は機能しておらず 使えないようです。
    (エクスプローラーでは削除できなかったのでコマンドプロンプト(管理者)を使った。)

    • 編集済み ery srow 2018年3月10日 6:32
    2018年3月8日 21:31