2012-05-04 8 views
22

ここで何が間違っていますか?私は、次の単純なクラスを持っている:シンボルが共有ライブラリにこのシンボルが存在することを示す場合でも、シンボルへの未定義参照

#include "libmnl/libmnl.h" 

int main() { 
    struct mnl_socket *a = mnl_socket_open(12); 
} 

とシンプルなgccコンパイル(gcc -lmnl main.c)を実行した後、私は次のエラーを取得:

/tmp/cch3GjuS.o: In function `main': 
main.c:(.text+0xe): undefined reference to `mnl_socket_open' 
collect2: ld returned 1 exit status 

共有ライブラリにNMを実行するには、それが実際に見つかったことを示しています

[email protected]:/tmp$ nm -D /usr/lib/libmnl.so | grep mnl_socket_open 
0000000000001810 T mnl_socket_open 

これはUbuntu 12.04で発生しています。 libmnl-devおよびlibmnl0パッケージがインストールされています。

[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", 0x7fff2a39b470) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.a", 0x7fff2a39b4d0) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.a", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.so", 0x7fff2a39b470) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.a", 0x7fff2a39b4d0) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.a", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libmnl.so", {st_mode=S_IFREG|0644, st_size=18608, ...}) = 0 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libmnl.so", O_RDONLY) = 7 

答えて

33

図書館、より正確に(それらを使用するオブジェクトの後に記載されている必要があり、ライブラリが、それはそのシンボルが含まれている場合にのみ使用されます。gccstrace出力はldは* .soのファイルは、まさにそれを使用していることを示し遭遇した時点で知られている未定義の参照を満たす)。 -lmnlをコマンドの最後に移動します。

+0

ありがとう、それは速かった。私は過去に私がオブジェクトの後ろに "偶然に"使っていたと思うので、今まではうまくいきました。 –