2017-12-29 75 views
0

私は以下の問題があります。私は "libdsm"プロジェクトの基盤に小さなsmbクライアントを構築しようとしています。私は必要なライブラリ(libdsm.aとlibtasn1.a)を構築しました。私のsmbクライアントはこれらの静的ライブラリを見ていますが、リンカは私に未定義の参照があることを通知します。このメッセージは私にとってはっきりしていて、リンクされた静的ライブラリが存在することを確認しました。どうしてそれが起こったのか分かりません。リンカーがそれを伝える理由はありますか?この問題を深く分析するためにどのツールを使用できますか?私は、この追加情報が有用であろうことを願っています小さなsmbクライアントを構築するための未定義参照

ELF Header: 


Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        REL (Relocatable file) 
    Machine:       Advanced Micro Devices X86-64 
    Version:       0x1 
    Entry point address:    0x0 
    Start of program headers:   0 (bytes into file) 
    Start of section headers:   2744 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   0 (bytes) 
    Number of program headers:   0 
    Size of section headers:   64 (bytes) 
    Number of section headers:   15 
    Section header string table index: 12 


Symbol table '.symtab' contains 26 entries: 
    Num: Value   Size Type Bind Vis  Ndx Name 
    12: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND _Z15smb_session_newv 
    13: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND inet_aton 
    14: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND _Z19smb_session_connectP1 
    15: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND _Z21smb_session_set_creds 
    16: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND _Z17smb_session_loginP11s 
    17: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND puts 
    18: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND _Z16smb_tree_connectP11sm 
    19: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND _Z9smb_fopenP11smb_sessio 
    20: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND _Z9smb_freadP11smb_sessio 
    21: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND _Z10smb_fcloseP11smb_sess 
    22: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND _Z19smb_tree_disconnectP1 
    23: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND _Z19smb_session_destroyP1 

:私の下 は私の小さなSMBクライアントの構築されたライブラリ

File: libdsm.a(md4.o) 
ELF Header: 
    Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        REL (Relocatable file) 
    Machine:       Advanced Micro Devices X86-64 
    Version:       0x1 
    Entry point address:    0x0 
    Start of program headers:   0 (bytes into file) 
    Start of section headers:   15128 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   0 (bytes) 
    Number of program headers:   0 
    Size of section headers:   64 (bytes) 
    Number of section headers:   23 
    Section header string table index: 20 


    17: 0000000000000000 97 FUNC GLOBAL DEFAULT 1 smb_session_new 
    18: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND calloc 
    19: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND smb_buffer_init 
    20: 0000000000000070 93 FUNC GLOBAL DEFAULT 1 smb_session_destroy 
    21: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND smb_session_share_clear 
    22: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND asn1_delete_structure 
    23: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND smb_buffer_free 
    24: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND free 
    25: 00000000000000d0 141 FUNC GLOBAL DEFAULT 1 smb_session_set_creds 
    26: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND __strndup 
    27: 0000000000000160 463 FUNC GLOBAL DEFAULT 1 smb_session_connect 
    28: 0000000000000000  0 NOTYPE GLOBAL DEFAULT UND smb_transport_nbt 

とオブジェクトファイルのreadelfが情報を表示します。

+1

取得したエラーメッセージをコピーして貼り付け、リンクステージで使用したコマンドラインをコピーして貼り付けてください。 (リンクの順序に問題があるかもしれません。画面上に表示されているものと同じものが見えるときに診断するのがずっと簡単です) – nos

+0

一般的に、libsはGCCのコマンドラインの最後にあります。 – alk

+0

g ++ -m64 -Wl、-O1 -o tinysmbclient main.o -L/usr/lib/x86_64-linux-gnu -lQtGui -lQtCore -lpthread main.o:関数 'main ': main.cpp :((smb_session *、char const *、unsigned int、int) 'への未定義の参照' – Mikola

答えて

0

alkありがとうございました。 main.cppの名前をmain.cに変更すると、すべてOkになります。私にとっては、クライアントをcまたはC++プログラムとしてコンパイルするのは問題ではありません。