2014-06-30 50 views
0

我對Linux比較陌生,在試圖弄清.SO文件的複雜性以及(64位)共享庫(及其版本,依賴關係等)如何工作時遇到了困難;以及如何鏈接它們並在基本的C++程序中使用它們?如何在Linux中調用或使用64位共享庫(.SO)文件?

這種情況是這樣的:我有一個名爲libfaidtz.so.3.0.0_debian6_64bit的共享庫文件(單個物理文件)。我在VMWare上安裝了Debian(最新版本)64位。我已經安裝(我相信)所有基本的C++開發工具都使用apt-get。

現在我想用C++編寫一個簡單的程序,該程序將鏈接libfaidtz.so.3.0.0_debian6_64bit,並使我能夠通過此.so文件調用兩個「導出」特定函數。不幸的是,我的機器上設置的環境/系統阻止我成功鏈接到這個庫。

任何人都可以在此引導我嗎?

我已經在下面列出了一些與.SO文件相關的細節。我想用(從.so文件)的函數具有以下功能的原型(應該工作):

int32_t DEF_EXPORT TZ_FAID_Size(int64_t start_time, 
int32_t roster_count, 
int64_t * roster_from, 
int64_t * roster_to, 
int32_t * roster_ids, 
int32_t & id_cnt); 

我從Windows背景是(動態鏈接和DLL明智)和我在努力得到這個.SO文件喜歡並用於基本的C++測試程序。

[email protected]:/home/maitreya/lib# ldd libfaidtz.so.3.0.0_debian6_64bit 

linux-vdso.so.1 => (0x00007fff667ff000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f3300a6f000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f33007ed000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3300461000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f330024b000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f3300f93000) 

[email protected]:/home/maitreya/lib# nm libfaidtz.so.3.0.0_debian6_64bit 

0000000000208c70 d DW.ref.__gxx_personality_v0 
0000000000006ebb T TZ_FAID_Process 
0000000000006e04 T TZ_FAID_Size 
0000000000007447 T TZ_FAID_Version 
0000000000208028 a _DYNAMIC 
0000000000208230 a _GLOBAL_OFFSET_TABLE_ 
       w _Jv_RegisterClasses 
00000000000011ca T _Z15FetchExpiryDatePiS_S_ 

等..

+0

」不幸的是,我的機器上設置的環境/系統阻止我成功鏈接到此庫。「 - 你的命令行是什麼?你會得到什麼錯誤? – Axel

+0

我試過很多次(設法將它連接一次,但是生成的二進制文件沒有執行。)目前,我將.SO和我的示例程序放在同一個文件夾中,並使用:g ++ useFAID .cc -L。 -lfaidtz.so.3.0.0_debian6_64bit -o test /usr/bin/ld:找不到-lfaidtz.so.3.0.0_debian6_64bit。我試過運行ldconfig並更新環境變量等。還嘗試更新GLIBC庫(32位)的味道。我得到的當前錯誤是:「/ usr/bin/ld:無法找到-lfaidtz.so.3.0.0_debian6_64bit collect2:錯誤:ld返回1退出狀態」 – BuddhaLight

+0

嗨,我設法解決這個幫助下很少人。謝謝大家。我採取的步驟是:1)將實際的共享庫文件(.SO)放在/ usr/lib文件夾中。 2)在同一個文件夾中爲它創建一個SOFT鏈接。 3)運行ldconfig -v(更新庫緩存)4)在我自己的文件夾中重建我的C++程序。 5)它運行並完成。 – BuddhaLight

回答

2

如果你看一些安裝在系統上的標準庫,你會看到,他們是軟鏈接。例如:我有/lib/libgpm.so.2.1.0軟鏈接/lib/libgpm.so。

嘗試創建軟鏈接libfaidtz.so到您的庫,然後鏈接-lfaidtz。 「

+0

謝謝你!最後設法讓它鏈接!現在我得到一個執行錯誤(對不起,我不是從Linux的背景):root @ debian:/ home/maitreya/UseFAID#./test ./test:加載共享庫時出錯:libfaidtz.so.3.0。 0_template:無法打開共享對象文件:沒有這樣的文件或目錄 – BuddhaLight

+0

好,那麼你的系統可以在構建時找到共享對象,但不能運行時。您可以嘗試將您的庫所在的目錄添加到LD_LIBRARY_PATH中。運行以下命令並再次嘗試重新啓動程序'export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH:/ path/to/your/so' – ianharris

+0

PLease參見上文。我已經設法最終讓這個圖書館與我的程序交談。感謝你和其他一些人以及互聯網。關鍵是把庫放在一個system-wid-e LIB目錄中,然後創建一個符號鏈接,然後執行一個LDCONFIG -v來更新庫緩存,然後......只構建我的程序。好極了!謝謝大家!我想離開這些步驟作爲我的問題的必要答案,但我認爲回答你自己的問題在本網站是非法的,所以我不會那樣做。謝謝。 – BuddhaLight

相關問題