Ubuntu 11.10中的链接器问题

cyb*_*rro 8 ubuntu linker gcc

在升级到Ubuntu 11.10之后,我发现我的许多旧的和当前的开发都不能再编译了.我把问题简化为一个简单的例子:

#include <X11/Xlib.h>

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用以下方法编译它:

g++ -lX11 test.cpp
Run Code Online (Sandbox Code Playgroud)

要么

g++ -c -o test.o test.cpp
g++ -lX11 -o test test.o
Run Code Online (Sandbox Code Playgroud)

导致失败发生:

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

有任何想法吗?我发现一些链接器的东西在11.10中发生了变化:

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

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

Emp*_*ian 20

g++ -lX11 -o test test.o

以上命令不正确.试试这个:

g++ test.o -lX11
Run Code Online (Sandbox Code Playgroud)

解释为什么订单在这里很重要.

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

  • 如果使用make,可以设置CC,CFLAGS,LDFLAGS和LDLIBS.在这种情况下,LDLIBS = -lX11是正确的,所以"foo:foo.o"变为:`cc foo.o -lX11 -o foo` (2认同)