2009-04-30 2 views
9

리눅스에서 ncurses를 사용하여 프로그램을 개발하려고합니다. Hello World 예도 컴파일 할 수 없습니다. 여기에 코드입니다 : 내가 컴파일 할 때리눅스에서 ncurses를 사용할 때 정의되지 않은 참조

#include <curses.h> 

int main() 
{   
     initscr(); 
     printw("Hello, world."); 
     refresh(); 
     getch(); 
     endwin(); 
     return 0; 
} 

, 내가 얻을 : 그 호출되는 함수의 모든 일에 대한

hello.c:(.text+0x12): undefined reference to `initscr' 

.

나는 apt-get을 통해 ncurses를 설치하고, 또한 내가 #include 모두 curses.hncurses.h을 시도 등, 설치,

을 소스를 다운로드하고 컴파일.

무슨 일입니까?

답변

12

연결할 때 -lcurses 옵션을 사용 했습니까?

헤더 파일을 포함하면 컴파일러에서 코드를 컴파일 할 수 있지만 컴파일러는 .h 파일에서 함수 호출이 어떻게 보이는지 알기 때문에 링커에서 프로그램에 링크 할 실제 코드를 찾기 위해 라이브러리 파일이 필요합니다.

11

Greg Hewgill이 말했듯이 -lcurses 또는 -lncurses을 전달해야 curses 라이브러리에 연결할 수 있습니다.

gcc -o hello hello.c -lncurses 

또한 아마 initscr()getch()를 사용하는 것을 의미한다. 일단 내가 그 치환을하면, 위의 것은 나를 위해 컴파일된다.

+1

왜'$ gcc -lncurses -o hello hello.c'가 작동하지 않지만'$ gcc -o hello hello.c -lncurses'는 왜 작동합니까? – rootkea

+0

@rootkea 링커는 명령 행에 나타나는 순서대로 객체를 조작하기 때문에. 'hello'를 처음 보았을 때, 필요한 모든 심볼을 기억하고,'ncurses' 라이브러리를 볼 때 찾은 것을 사용하여 심볼을 해석합니다. 'ncurses'가 처음 오면, 그것은 많은 심볼을 보지만 "나는 그것들 중 어느 것도 필요로하지 않는다"고 말하고 그것들을 버린다. [documentation] (https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-l-1172) 또는 [기타 SO 탐구] (http://stackoverflow.com/questions/45135)를 참조하십시오./linker-order-gcc)를 참조하십시오. –

4

비슷한 문제가있는 사람 : -lx 인수 (여기서 x는 라이브러리 임)는 항상 소스 및 오브젝트 파일을 따라야합니다.

+0

이것은 내 문제를 명확히 해결했습니다! – Richard

0

나는 비슷한 문제가있어서 도움이되는 해결책을 찾았지만 여기에 게시 된 다른 답변과 약간 다릅니다. 내가 저주와 패널 라이브러리를 사용하려고했던 내 컴파일 명령했다 :

$ gcc -o hello hello.c -lncurses -lpanel 

내가 다른 답변을 읽을 때, 나는 이 -lncurses 플래그를 포함 때문에 나는 당황했지만, 여전히 컴파일되지 않았습니다

"패널 라이브러리를 사용하려면 :

$ gcc -o hello hello.c -lncurses -lpanel 
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libpanel.a(p_new.o): In function `new_panel': 
p_new.c:(.text+0x18): undefined reference to `_nc_panelhook' 

내가 마지막으로 the tldp에 내 대답 발견, 그리고 당신이지고 있었다과 유사한 오류가있는 함수를 사용하려면 panel.h를 포함하고 패널 라이브러리와 프로그램을 연결해야합니다. 플래그 -lpanel은 -lncurses와 함께이 순서대로 추가되어야합니다. "

그래서 컴파일 플래그를 사용할 때 순서가 중요해 보입니다! 순서 전환을 시도했습니다.

gcc -o hello hello.c -lpanel -lncurses 

이렇게하면 컴파일이 성공적으로 완료되었습니다. 나는 당신이 이미 당신의 대답을 가지고 있다는 것을 알고 있습니다, 그래서 이것이 누군가를 돕기를 바랍니다.