2011-08-01 66 views
13

Tôi đang sử dụng các chức năng khác nhau như stdlib srand() chẳng hạn, vv Tôi có dòngstdlib.h: không có tập tin hoặc thư mục

#include <stdlib.h> 

ở đầu mã của tôi.

tôi bước này trên dòng lệnh:

# find/-name stdlib.h 

find: `/home/dmurvihill/.gvfs: permission denied 
/usr/include/stdlib.h 
/usr/include/bits/stdlib.h 

Vì vậy, stdlib.h rõ ràng là trong/usr/include.

tiền xử lý của tôi:

# gcc -print-prog-name=cc1 

/usr/libexec/gcc/x86_64-redhat-linux/4.5.1/cc1 

đường dẫn tìm kiếm mặc định tiền xử lý của tôi:

# /usr/libexec/gcc/x86_64-redhat-linux/4.5.1/cc1 -v 

ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.5.1/include-fixed" 
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../x86_64-redhat-linux/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/local/include 
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/include 
/usr/include 
End of search list. 

Vì vậy, stdlib.h rõ ràng là trong/usr/include, mà chắc chắn là hầu hết các nghĩa vụ phải được tìm kiếm bởi tôi preprocessor, nhưng tôi vẫn nhận được lỗi này!

/path/to/cpa_sample_code_main.c:15:20: fatal error: stdlib.h: No such file or directory 
compilation terminated 

Cập nhật

Một chương trình tôi đã viết để kiểm tra mã này:

#include <stdio.h> 
#include <stdlib.h> 
#include <linux/time.h> 

int main() 
{ 
    printf("Hello, World!\n"); 
    printf("Getting time...\n"); 
    time_t seconds; 
    time(&seconds); 
    printf("Seeding generator...\n"); 
    srand((unsigned int)seconds); 
    printf("Getting random number...\n"); 
    int value = rand(); 
    printf("It is %d!",value); 
    printf("Goodbye, cruel world!"); 
    return 0; 
} 

Lệnh

gcc -H -v -fsyntax-only stdlib_test.c 

đầu ra

Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.5.1/lto-wrapper 
Target: x86_64-redhat-linux 
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,lto --enable-plugin --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux 
Thread model: posix 
gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) 
COLLECT_GCC_OPTIONS='-H' '-v' '-fsyntax-only' '-mtune=generic' '-march=x86-64' 
/usr/libexec/gcc/x86_64-redhat-linux/4.5.1/cc1 -quiet -v -H /CRF_Verify/stdlib_test.c -quiet -dumpbase stdlib_test.c -mtune=generic -march=x86-64 -auxbase stdlib_test -version -fsyntax-only -o /dev/null 
GNU C (GCC) version 4.5.1 20100924 (Red Hat 4.5.1-4) (x86_64-redhat-linux) 
    compiled by GNU C version 4.5.1 20100924 (Red Hat 4.5.1-4), GMP version 4.3.1, MPFR version 2.4.2, MPC version 0.8.1 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.5.1/include-fixed" 
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../x86_64-redhat-linux/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/local/include 
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/include 
/usr/include 
End of search list. 
GNU C (GCC) version 4.5.1 20100924 (Red Hat 4.5.1-4) (x86_64-redhat-linux) 
    compiled by GNU C version 4.5.1 20100924 (Red Hat 4.5.1-4), GMP version 4.3.1, MPFR version 2.4.2, MPC version 0.8.1 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
Compiler executable checksum: ea394b69293dd698607206e8e43d607e 
. /usr/include/stdio.h 
.. /usr/include/features.h 
... /usr/include/sys/cdefs.h 
.... /usr/include/bits/wordsize.h 
... /usr/include/gnu/stubs.h 
.... /usr/include/bits/wordsize.h 
.... /usr/include/gnu/stubs-64.h 
.. /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stddef.h 
.. /usr/include/bits/types.h 
... /usr/include/bits/wordsize.h 
... /usr/include/bits/typesizes.h 
.. /usr/include/libio.h 
... /usr/include/_G_config.h 
.... /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stddef.h 
.... /usr/include/wchar.h 
... /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stdarg.h 
.. /usr/include/bits/stdio_lim.h 
.. /usr/include/bits/sys_errlist.h 
. /usr/include/stdlib.h 
.. /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stddef.h 
.. /usr/include/bits/waitflags.h 
.. /usr/include/bits/waitstatus.h 
... /usr/include/endian.h 
.... /usr/include/bits/endian.h 
.... /usr/include/bits/byteswap.h 
..... /usr/include/bits/wordsize.h 
.. /usr/include/sys/types.h 
... /usr/include/time.h 
... /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stddef.h 
... /usr/include/sys/select.h 
.... /usr/include/bits/select.h 
..... /usr/include/bits/wordsize.h 
.... /usr/include/bits/sigset.h 
.... /usr/include/time.h 
.... /usr/include/bits/time.h 
... /usr/include/sys/sysmacros.h 
... /usr/include/bits/pthreadtypes.h 
.... /usr/include/bits/wordsize.h 
.. /usr/include/alloca.h 
... /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stddef.h 
. /usr/include/linux/time.h 
.. /usr/include/linux/types.h 
... /usr/include/asm/types.h 
.... /usr/include/asm-generic/types.h 
..... /usr/include/asm-generic/int-ll64.h 
...... /usr/include/asm/bitsperlong.h 
....... /usr/include/asm-generic/bitsperlong.h 
... /usr/include/linux/posix_types.h 
.... /usr/include/linux/stddef.h 
.... /usr/include/asm/posix_types.h 
..... /usr/include/asm/posix_types_64.h 
In file included from /CRF_Verify/stdlib_test.c:3:0: 
/usr/include/linux/time.h:9:8: error: redefinition of ‘struct timespec’ 
/usr/include/time.h:120:8: note: originally defined here 
/usr/include/linux/time.h:15:8: error: redefinition of ‘struct timeval’ 
/usr/include/bits/time.h:75:8: note: originally defined here 
Multiple include guards may be useful for: 
/usr/include/asm/posix_types.h 
/usr/include/bits/byteswap.h 
/usr/include/bits/endian.h 
/usr/include/bits/select.h 
/usr/include/bits/sigset.h 
/usr/include/bits/stdio_lim.h 
/usr/include/bits/sys_errlist.h 
/usr/include/bits/time.h 
/usr/include/bits/typesizes.h 
/usr/include/bits/waitflags.h 
/usr/include/bits/waitstatus.h 
/usr/include/gnu/stubs-64.h 
/usr/include/gnu/stubs.h 
/usr/include/wchar.h 
+4

Có vẻ như bạn đang mã hóa đường dẫn tìm kiếm trong công cụ xây dựng của mình hoặc đó là vấn đề về quyền đối với tôi (Tại sao bạn không thể truy cập .gvfs? Bạn không phải là chủ sở hữu của tất cả các tệp trong thư mục chính của mình?). Hãy thử sử dụng một công cụ như 'strace' và biên dịch lại, kiểm tra lỗi truy cập tệp. Grep strace đầu ra cho stdlib.h, chắc chắn rằng nó đang tìm kiếm nơi bạn mong đợi. – Josh

+0

Biên dịch lại với 'gcc -H -v -fsyntax-only/path/to/cpa_sample_code_main.c' và đăng kết quả COMPLETE, UNEDITED. – zwol

+1

bạn có thể cung cấp cho chúng tôi lệnh biên dịch bạn đang sử dụng không? Ví dụ: 'gcc -g -o cpa_sample_code ...' – Jason

Trả lời

8

Lỗi của bạn dường như xuất phát từ bao gồm linux/time.h khi cũng cố gắng bao gồm stdlib.h. linux/time.h là một tiêu đề hạt nhân và chỉ nên được sử dụng trong mã hạt nhân. stdlib.h là chức năng của người dùng và chỉ nên được sử dụng trong các chương trình người dùng. Nếu bạn nhận thấy lỗi bạn nhận được:

/usr/include/linux/time.h:12: error: redefinition of 'struct timespec' 
/usr/include/linux/time.h:18: error: redefinition of 'struct timeval' 

bạn có thể thấy rằng bạn đang gặp lỗi liên quan đến điều này. Như đã thấy trong dấu vết dài của bạn, điều này là do stdlib.h bao gồm time.h (một trong số /usr/include, không phải /usr/include/linux). Tôi tưởng tượng rằng đây là nguyên nhân thực sự của lỗi bạn nhìn thấy về việc không tìm stdlib.h (mặc dù tôi không thể tưởng tượng chi tiết về cách các lỗi xảy ra theo cách của chúng).

+1

Bingo. Tôi thay thế srand với get_random_bytes() từ linux/random.h, và nó bây giờ hoạt động như một sự quyến rũ. Tôi mới vào lập trình không gian hạt nhân, và tôi đã không nhận ra rằng TẤT CẢ các thư viện chuẩn không có sẵn (giải thích các thẻ -nostdinc). Cảm ơn tất cả sự giúp đỡ, mọi người! –

1

Đối với bất cứ ai hạ cánh ở đây cố gắng để biên dịch một chương trình C++ với Cygwin trên Windows, vấn đề của tôi là tôi có cả MinGWCygwin. MingW được cài đặt như một phần của thiết lập Cygwin. Tôi đã sử dụng setup.exe (hãy gọi nó là trình cài đặt gói) từ Cygwin và xóa tất cả các phiên bản của MingW. Sau đó, ứng dụng thử nghiệm của tôi được biên dịch đúng cách.

Lưu ý: Giải pháp này phù hợp với tôi. Có nhiều lý do khác khiến bạn gặp lỗi tương tự.

0

Tôi đã tìm thấy một nguyên nhân khác khi sử dụng g ++ v6.x, bug 70129.Tôi kích hoạt nó khi chỉ định -isystem (thông qua từ khóa SYSTEM của CMake) cho thư mục Boost bao gồm - cuối cùng bao gồm cstdlib.

Các vấn đề liên quan