12980


`<sys/socket.h>`が見つからないためにエラーが出ました  
環境は

[code]

    $ cat /etc/lsb-release
    DISTRIB_ID=Ubuntu
    DISTRIB_RELEASE=14.04
    DISTRIB_CODENAME=trusty
    DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS"
    
[/code]

何かインストールしなければ`<sys/socket.h>`は利用できないのですか。。。

* * *

【追記】  
argusさんの

[code]

    # apt-get install libc6-dev  # root 権限で実行
    
[/code]

で`<sys/socket.h>`が見つからないエラーは解決しましたが、プログラム自体でwriteとcloseが見つからないというエラーに変わってしまいました。  
具体的なプログラムは[単純なTCPサーバ](http://www.geekpage.jp/programming/linux-
network/tcp-1.php)のプログラムです。

[code]

    /* 5文字送信 */
    write(sock, "HELLO", 5);
    
    /* TCPセッションの終了 */
    close(sock);
    
[/code]

他にもまだインストールが不十分なファイルがあるのですか。。

* * *

【開発環境についての補足】

統合開発環境：NetBeans IDE 8.0.2  
ビルドツール：

[code]

    https://i.stack.imgur.com/szdho.png
    
[/code]

Cインクルードディレクトリ

[code]

    https://i.stack.imgur.com/aSFGS.png
    
[/code]

C++インクルードディレクトリ

[code]

    https://i.stack.imgur.com/mFvrq.png
    
[/code]

信用度によるリンク規制のためリンクをコードとして記載しました。

* * *

【解決しました！】

ファイルのプロパティの一般、ツールで確認したところC++コンパイラになっていたところを  
Cコンパイラへ変更したら無事コンパイルできました！  
ありがとうございます！！


CC BY-SA 3.0
2015-08-03T05:38:28.000
12976
2015-08-06T08:43:25.690
2015-08-03T08:10:37.100
10774
10774
question
ubuntu
<sys/socket.h>が見つかりません


`sys/socket.h` ファイルがどのパッケージに含まれているのかは dpkg コマンドを使って調べることができます。

[code]

    $ dpkg --search sys/socket.h
    libc6-dev:amd64: /usr/include/x86_64-linux-gnu/sys/socket.h
    
[/code]

libc6-dev パッケージに含まれていますので、インストール状況を調べます。

[code]

    $ dpkg --list libc6-dev
    
[/code]

上記を実行して `dpkg-query: no packages found matching libc6-dev`
などと表示される場合は、`libc6-dev` パッケージをインストールする必要があります。

[code]

    # apt-get install libc6-dev  # root 権限で実行
    
[/code]


CC BY-SA 3.0
2015-08-03T05:56:41.270
12980
2015-08-03T05:56:41.270
12976
answer


コンパイラを C++ から C へ変更することで解決したとありますけれど、それは根本的な解決ではありません。`read()`、`write()`、
`close()` は `<unistd.h>` で宣言されていますが、件のプログラムでは `#include <unistd.h>`
されていないのが問題です。  
`read()` に関してはエラーが上がっていないようですが、別のヘッダ経由で所でたまたま宣言されたのでしょう。

C では、宣言のされていない関数は暗黙に引数や戻り値の型が仮定されますけれど、 C++
では明示的に宣言されていなければならないのがコンパイルエラーの原因です。  
C コンパイラでコンパイルした時も、警告レベルを上げていれば、暗黙的な宣言がされた旨の警告が出力されると思います。  
逆に、 `#include <unistd.h>` を適切に記述していれば、 C++ コンパイラでもコンパイルが通ると思います。

また、C の場合でも、単に警告だけの問題ではなく、実際に暗黙的な宣言と本来のプロトタイプに差があるため、アーキテクチャや使用場面によって問題が発生し得ます。  
例えば、`write()` のプロトタイプは

[code]

    ssize_t write(int, const void *, size_t);
    
[/code]

ですけれど、件のプログラムで暗黙的に宣言されたものでは、

[code]

    int write(int, const char *, int);
    
[/code]

と仮定されます。  
`size_t` や `ssize_t` と `int` のサイズが異なる処理系では問題が発生し得ますし、(こちらは具体例が出てきませんが) `const
void *` と `const char *` の内部表現が異なるような処理系でも問題が発生し得ます。

ライブラリ関数は大抵 man ページに載っており、どのヘッダファイルを `#include`
すべきかが書かれてあります。ライブラリ関数を呼んだら暗黙的な宣言だとか、宣言されていないだとか言われた場合は、 man ページで調べるようにしてみましょう。


CC BY-SA 3.0
2015-08-03T13:28:49.413
12997
2015-08-03T13:34:07.630
2015-08-03T13:34:07.630
7831
7831
12976
answer


以下のコマンドを試してみてください。両方同時に解決できると思います。

[code]

    sudo apt-get install libc6-dev-amd64
    
[/code]


CC BY-SA 3.0
2015-08-06T08:43:25.690
13106
2015-08-06T08:43:25.690
10827
12976
answer