今回の問題
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も参考にしました。