Gcc Ubuntu 11.10中的链接器问题

Gcc Ubuntu 11.10中的链接器问题,gcc,ubuntu,linker,Gcc,Ubuntu,Linker,升级到Ubuntu11.10后,我发现我的许多旧的和当前的开发都无法再编译了。我已将问题简化为一个简单的示例: #include <X11/Xlib.h> int main() { Display* display = XOpenDisplay(":0.0"); XCloseDisplay(display); return 0; } 或 导致发生故障: /tmp/ccBAOpzy.o: In function `main': test.cpp:(.tex

升级到Ubuntu11.10后,我发现我的许多旧的和当前的开发都无法再编译了。我已将问题简化为一个简单的示例:

#include <X11/Xlib.h>

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

    return 0;
}

导致发生故障:

/tmp/ccBAOpzy.o: In function `main':
test.cpp:(.text+0x11): undefined reference to `XOpenDisplay'
test.cpp:(.text+0x21): undefined reference to `XCloseDisplay'
有什么想法吗?我发现11.10中的一些链接器内容发生了变化:

但仍然不能解释这些问题

g++-lX11-o测试test.o

上述命令不正确。请尝试以下方法:

g++ test.o -lX11
解释订单的重要性


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

您应该在以前安装过X11开发包libx11 dev。@我知道这一点。实际上,问题在于参数顺序。Ubuntu11.10发布了GCC4.6.1,它显然引入了更严格的参数排序约束。g++test.cpp-lX11工作正常。现在让我们看看如何让SCON解决这个问题……对于所有说问题出在未安装libx11 dev中的人,请仔细阅读错误消息:它不会抱怨libX11不存在。我相信文档一直都很清楚地坚持要求命令行中的
-l
选项必须是最后一个选项。无论如何,如果你自己解决了问题,发布并接受你的解决方案,这样这个问题就不再被标记为未解决。如果(a)你的
$PATH
中没有
,并且(b)你调用它作为
/test
而不是
test
,调用一个可执行的
测试就可以了。但是如果它确实在路径上,你从未听说过的shell脚本将在你周围爆炸,你的机器将不再是原来的样子。实际上,大多数shell都有一个内置的命名测试,现在很多脚本更喜欢使用
[
,所以可能什么都不会发生……也许。如果使用make,可以设置CC、CFLAGS、LDFLAGS和LDLIBS。LDLIBS=-lX11在这种情况下做得对,所以“foo:foo.o”变成:
CC foo.o-lX11-o foo
/tmp/ccBAOpzy.o: In function `main':
test.cpp:(.text+0x11): undefined reference to `XOpenDisplay'
test.cpp:(.text+0x21): undefined reference to `XCloseDisplay'
g++ test.o -lX11