2012-01-24 13 views
7

Ubuntu 11.10にアップグレードした後、私の古い開発や現在の開発の多くはもうコンパイルできないことがわかりました。私は簡単な例に、問題を軽減しました:使用してそれをコンパイルUbuntu 11.10のリンカの問題

#include <X11/Xlib.h> 

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

    return 0; 
} 

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' 

何か案は?私はいくつかのリンカのものは11.10に変更されていることを発見しました:

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

しかし、まだ、これらの問題を説明していません。上記のコマンド

+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'の呼び出しは、*(a)あなたの' $ PATH'に '.'がなく、(b)あなたが' test'ではなく '。/ test'として起動してもOKです。 –

+0

しかし、それがPATHに載っていれば、聞いたことのないシェルスクリプトはあなたの周りで爆発し始め、あなたのマシンは決して同じではありません。実際には、ほとんどのシェルには名前付きテストが組み込まれていますが、多くのスクリプトは最近[...]を使うことを好みます。 – ams

+2

makeを使用する場合は、CC、CFLAGS、LDFLAGS、およびLDLIBSを設定できます。この場合、LDLIBS = -lX11は正しいことを行います。したがって、 "foo:foo.o"は次のようになります: 'cc foo.o -lX11 -o foo' –

関連する問題