0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ubuntu 22.04でlibc.hがコンパイルできない

Posted at

今回の問題

test.c
#include <libc.h>

int main()
{
        int eof = EOF;
        int fd = open("test.txt", O_RDONLY);
        char *str = (char *)malloc(11);
        int n = read(fd, str, 10);

        printf("EOF:%d\ntest.txt:%s\n", eof, str);
        close(fd);
        return (0);
}

test.txt
1234567890

上記のプログラムはmac環境でコンパイルすると、問題なく

a.out
EOF:-1
test.txt:1234567890

と出力されますが、ubuntuでコンパイルした際、「libc.h」が参照できないという旨のエラーを吐き出してしまいました。

原因

そもそもlibc.hというヘッダファイルは本来存在していないようです。なので、ubuntu環境でlibc.hをインクルードしようとしても未定義なヘッダファイルを読み込もうとしていることになってしまいます。

なぜmac環境でコンパイルできたのか

結論、Appleが独自でlibc.hというヘッダファイルを用意しているらしいです。
以下、公式からの引用。

libc.h
#ifndef LIBC_H
#define LIBC_H

#include <stdio.h>
#include <standards.h>
#include <unistd.h>

#ifdef	__STRICT_BSD__
#include <strings.h>
#include <varargs.h>
#else
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <stdarg.h>
#endif

#include <sys/param.h>
#include <sys/mount.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/resource.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <mach/machine/vm_types.h>
#include <mach/boolean.h>
#include <mach/kern_return.h>

#endif  /* _LIBC_H */

これをインクルードしていたおかげでmac環境では先ほどのプログラムがコンパイルできていました。しかし、linux環境にはlibc.hのヘッダファイルが用意されていないので、使いたい関数やマクロが含まれるヘッダファイルを別でインクルードしなければならないようです。

test.c
#include <stdio.h>
#include <sys/file.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
        int eof = EOF;
        int fd = open("test.txt", O_RDONLY);
        char *str = (char *)malloc(11);
        int n = read(fd, str, 10);

        printf("EOF:%d\ntest.txt:%s\n", eof, str);
        close(fd);
        return (0);
}

  • EOF, printf -> stdio.h
  • open -> sys/file.h(libc.hにはありませんでしたが私はfcntl.hをよく使います)
  • malloc -> stdlib.h
  • read, close -> unistd.h
    上記のようにそれぞれ対応するヘッダファイルをインクルードすることで解決。

参考にしたサイト

各種manも参考にしました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?