2014-03-04 13 views
6

아래의 코드를 컴파일하려고했습니다 (https://stackoverflow.com/a/478960/683218). 컴파일 내가mingw : -std = C++로 컴파일 할 때 함수를 찾을 수 없습니다. 11

$ g++ test.cpp 

컴파일하면, OK 갔다하지만 -std=c++11 스위치를 사용할 때 잘못된 :

$ g++ -std=c++11 test.cpp 
test.cpp: In function 'std::string exec(char*)': 
test.cpp:6:32: error: 'popen' was not declared in this scope 
    FILE* pipe = popen(cmd, "r"); 
           ^

어떤 생각이 무슨 일이야?

(나는 mingw.org에서 mingw32 gcc4.8.1를 사용하고, 그리고 WindowsXP64에)

코드 :

#include <string> 
#include <iostream> 
#include <stdio.h> 

std::string exec(char* cmd) { 
    FILE* pipe = popen(cmd, "r"); 
    if (!pipe) return "ERROR"; 
    char buffer[128]; 
    std::string result = ""; 
    while(!feof(pipe)) { 
     if(fgets(buffer, 128, pipe) != NULL) 
      result += buffer; 
    } 
    pclose(pipe); 
    return result; 
} 

int main() {} 
+4

관련없는,하지만 예상대로', 그것은 작동하지 않습니다 동안'하지 않는다 (무엇이 일어 났는지를 결정하기 위해 feof (...)!이) 그것까지. 왜냐하면'EOF' 플래그는 파일 끝에서부터 읽기를 시도 할 때까지 설정되지 않기 때문에, 한 번에 여러 번 반복 할 것입니다. 대신에 당신의 경우'while (fgets (...)! = 0)'을 수행하면됩니다. 이것은 C++ 스트림에서도 읽을 때와 동일합니다. –

답변

5

내가 popen는 ++ 표준 ISO C 없기 때문에 이런 생각 (이 POSIX에서 온다 .1-2001).

당신이 시도 할 수 :

$ g++ -std=c++11 -U__STRICT_ANSI__ test.cpp 

(-U 매크로의 이전 정의를 취소, 중 하나 -D 옵션으로 내장 또는 제공)

또는

$ g++ -std=gnu++11 test.cpp 

(GCC defines __STRICT_ANSI__ -ansi 스위치 또는 -std 스위치가있는 경우에만 GCC가 호출 될 때,

_POSIX_SOURCE/_POSIX_C_SOURCE 매크로 재생) 지정 ISO C 또는 ISO C++의 일부 버전의 엄격한 준수를 지정 마녀는 가능한 대안 (http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html)입니다.

+0

감사합니다. 그랬어. – tinlyx

0

그냥 시작 부분에서이 추가 : * 현재 * 문제에

extern "C" FILE *popen(const char *command, const char *mode);