2012-01-24 138 views
7

中的链接器问题,我发现我的许多旧的和当前的开发不能再编译了。我已经减少了问题一个简单的例子:在升级到Ubuntu 11.10后,Ubuntu 11.10

g++ -lX11 test.cpp 

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

导致失败的情况发生:

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

#include <X11/Xlib.h> 

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

    return 0; 
} 

使用它编译有任何想法吗?我发现,有些链接的东西,在11.10已经改变:

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

但仍然没有解释这些问题。

+0

您应该在之前安装了X11开发包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

上面的命令是不正确。试试这个:

g++ test.o -lX11 

为什么顺序重要here解释。

此外,您不应该在UNIX上调用您的可执行文件test

+0

调用一个可执行文件'test'就可以了*如果*(a)你的'$ PATH'中没有'.',并且(b)你调用它作为'./test'而不是'test'。 –

+0

但是,如果它确实存在于PATH中,那么您从未听说过的shell脚本将开始在您周围爆炸,并且您的计算机将永远不会再次一样。实际上,大多数shell都有一个内置的命名测试,许多脚本更喜欢使用'['这些天,所以可能没有任何反应....也许。 – ams

+2

如果使用make,可以设置CC,CFLAGS,LDFLAGS和LDLIBS。 LDLIBS = -lX11在这种情况下做正确的事情,所以“foo:foo.o”变成:'cc foo.o -lX11 -o foo' –