2015-01-24 1 views
3

내 작은 프로그램을 작성하여이 문제 (예제 : hello.c)를 시연했습니다. (sidenote :이 프로그램에서 메모리 누수가 있음을 발견했지만 단지 예는하지 않는 것이 중요합니다 그래서) : 나는, 그 소리와 bmake를 사용하여, BSD에서,Clang이 "c99에서 암시 적 선언이 불법입니다"라는 C11 프로그램을 컴파일하지 못했습니다.

CFLAGS += -std=c11 -Wall -Werror -Wpedantic 
CPPFLAGS := -D_XOPEN_SOURCE=700 

EXES := hello 

all: $(EXES) 

clean: 
    rm -f $(EXES) *.o 

그러나 :

#include <stddef.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char ** argv) { 
    char * buf = NULL; 
    size_t buflen = 0; 

    ssize_t line_len; 

    while ((line_len = getline(&buf, &buflen, stdin)) > 0) { 
     buf[line_len - 1] = '\0'; 

     char * val = getenv(buf); 

     if (val) { 
      printf("setenv %s \"%s\"\n", buf, val); 
     } 
     else { 
      fprintf(stderr, "warning: %s not found\n", buf); 
     } 
    } 

    return EXIT_SUCCESS; 
} 

이 GCC를 사용하여, 리눅스에서 잘 컴파일하고 GNU는 다음 메이크로 확인 컴파일 할 수 없습니다 (정확히 동일한 메이크 파일과 소스 파일)이 될 _POSIX_C_SOURCE을 정의하는 man 페이지에 따라 또한

hello.c:11:24: error: implicit declaration of function 'getline' is invalid in 
    C99 [-Werror,-Wimplicit-function-declaration] 

당신이 볼 수 있듯이 문제는 내가 C99 모드에서 컴파일 하지이야 것을이지만, C11 등을 말한다 때문에 200809 또는 그 이상은 getline을 가능하게해야하며, 다른 곳에서는 _XOPEN_SOURCE을 700으로 정의하면 안심할 수 있습니다.

-W 플래그를 사용하면 도움이되지 않습니다.

그래서 내가 뭘 잘못하고 있니? 컴파일하려면 어떻게해야합니까? 나는 혼란 스럽다.

+0

OS X에서 코드는 makefile과'make'를 사용하여 완벽하게 빌드되고 실행됩니다. 'gcc -v'에는'Apple LLVM 버전 6.0 (clang-600.0.56) (LLVM 3.5svn 기반)'이 포함되어 있습니다. 그래서 혼자서하는 문제는 아닙니다. – Tommy

+1

"In C99"는 적어도이 경우 "In C99 또는 그 이상"을 의미합니다. 당신은 꽤 바른 나무를 짖지 않는다 :) – hobbs

+0

cppflags가 적용되지 않는 경우가있는 것처럼 보입니다. 'cc -D_XOPEN_SOURCE = 700 ... '을 사용하여 수동으로 컴파일 할 수 있습니다. 'make '만 실행하면 작동하지 않는 것 같습니다. –

답변

2

_POSIX_C_SOURCE 또는 _XOPEN_SOURCE 중 하나를 명시 적으로 설정하지 않으면 일반 정의를 사용할 수없고 POSIX 함수가 선언되지 않음을 의미하는 -std=c11 -Wpedantic을 설정했습니다. 첫 번째 #include 앞에 #define _XOPEN_SOURCE 700 (또는 Linux의 경우 800)을 추가하면 모두 잘됩니다.

makefileCPPFLAGS = -D_XOPEN_SOURCE=700이 있습니다. CPPFLAGS은 실제로 GCC 명령 줄에 표시됩니까?

gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \ 
    -Wold-style-definition -Werror -pedantic -c yourprog.c 

유일한 : 나는 정기적으로 -std=c11와 맥 OS X 10.10.1에 컴파일하고 난 당신의 코드를 가지고 그것을 그대로 컴파일 할 수 있습니다, 그러나 _XOPEN_SOURCE (700)에 설정하는 헤더가

불만 사항은 argc도 아니고 argv도 사용되지 않습니다 (따라서 컴파일이 실패하지만, getline() 때문에).

CPPFLAGS은 반드시 BSD make에 의해 인식되는 것은 아닙니다. CPPFLAGS을 인식해야하는 보편적 인 표준은 없습니다.

+0

그것이 makefile의'CPPFLAGS : ='가하는 일입니다. 나는 cppflags를 적용하지 않는 이유를 모른다. 'cc -D_XOPEN_SOURCE = 700'을 수동으로 실행하면 컴파일이 잘됩니다. –

+0

아. 그것은 고통입니다. 나는 그들을 CFLAGS에 덧붙여서 작동했다. 오히려 짜증나게합니다. 나는 또 다른 FreeBSD 10.1 VM을 (같은 방식으로) 설정했고, 그 일을했습니다.차이점은 무엇인지 모르겠습니다. 조사 할게. 감사합니다. –