2012-01-24 5 views
7

의 링커 문제가 발생했습니다. 이전과 현재의 많은 개발 내용을 더 이상 컴파일 할 수 없음을 발견했습니다. 나는 간단한 예에 문제를 감소했습니다우분투 11.10으로 업그레이드 한 후 우분투 11.10

/tmp/ccBAOpzy.o: In function `main': 
test.cpp:(.text+0x11): undefined reference to `XOpenDisplay' 
test.cpp:(.text+0x21): undefined reference to `XCloseDisplay' 

:

g++ -lX11 test.cpp 

또는

g++ -c -o test.o test.cpp 
g++ -lX11 -o test test.o 

이 발생하는 실패 원인 :

#include <X11/Xlib.h> 

int main() { 
    Display* display = XOpenDisplay(":0.0"); 
    XCloseDisplay(display); 

    return 0; 
} 

는 사용하여 컴파일 어떤 아이디어? 이러한 문제를 설명하지 않습니다 여전히

https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition

을하지만 : 좀 링커 물건 11.10에서 변경된 것을 발견했습니다. 위의 명령

+0

이전에 X11 dev 패키지 libx11-dev를 설치해야합니다. – boto

+4

@boto 알아. 사실, 문제는 매개 변수 순서에있었습니다. Ubuntu 11.10에는 GCC 4.6.1이 포함되어 있으며, 이는 더 엄격한 매개 변수 순서 지정 제한을 도입합니다. g ++ test.cpp -lX11 잘 작동합니다. – cyberguijarro

+0

이제 SCons가 어떻게 작동하는지 확인해 보겠습니다. – cyberguijarro

답변

20

g++ -lX11 -o test test.o

잘못된입니다. 대신이 시도 : 순서가 here 중요한 이유의

g++ test.o -lX11 

설명.

또한 UNIX에서는 실행 파일 test을 절대로 호출해서는 안됩니다.

+0

'test' 실행 파일을 호출하는 것은'$ PATH'에'.'가없는 * (a), 그리고 (b)'test'보다는'./test'로 호출 할 때 괜찮습니다. –

+0

하지만 PATH에 올라 타면 들어 본 적이없는 셸 스크립트가 주위에서 폭발하기 시작하고 컴퓨터가 다시는 동일하지 않게됩니다. 사실, 대부분의 셸에는 내장 테스트라는 이름의 테스트가 있는데, 많은 스크립트에서는 요즘 사용하기를 선호하기 때문에 아무 일도 일어나지 않을 수도 있습니다. – ams

+2

make를 사용하는 경우 CC, CFLAGS, LDFLAGS 및 LDLIBS를 설정할 수 있습니다. 이 경우 LDLIBS = -lX11은 올바른 일을하므로 "foo : foo.o"는 다음과 같이됩니다 :'cc foo.o -lX11 -o foo' –

관련 문제