2016-12-14 24 views
1

我有一個問題,聽起來令人討厭的簡單,但我覺得我已經嘗試了一切來解決它,我出來的想法。鏈接到共享助推庫令人頭痛

我有一個程序,我寫使用包括聲明其採用升壓/ program_options.hpp

#include <boost/program_options.hpp> 

該程序適用於我的筆記本電腦,現在我試圖把它放到哪裏我不知道一個服務器有sudo特權。在我的筆記本電腦上,整個工作的地方,我有升級版本1.56和1.58,在服務器上我發現1.53.0。我沒有安裝或建立這個。

服務器上存在的共享庫文件是: /usr/lib64/libboost_program_options.so.1.53.0

運行上LDD給我的輸出:

ldd /usr/lib64/libboost_program_options.so.1.53.0 
linux-vdso.so.1 => (0x00007ffc54a63000) 
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fc0dcad8000) 
libm.so.6 => /lib64/libm.so.6 (0x00007fc0dc7d5000) 
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc0dc5bf000) 
libc.so.6 => /lib64/libc.so.6 (0x00007fc0dc1fe000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fc0dd071000) 

我哪假設意味着它找到了它的所有依賴關係。

我已經做了一個符號鏈接到我的主目錄來創建一個libboost_program_options.so鏈接,我猜這意味着-lboost_program_options鏈接器標誌應該工作。

我編譯的方法是:

g++ -L/home/homeDir code.cpp -o code.o -std=c++11 -Wall -lboost_program_options 

和所有我得到的是:

fatal error: boost/program_options.hpp: No such file or directory 
#include "boost/program_options.hpp" 
            ^
compilation terminated. 

我已經與報價和<>想這一點,並沒有 「升壓/」 等,但我總是得到同樣的投訴。我認爲這意味着它找到了庫,因爲沒有關於-lboost_program_options標誌的投訴?

雖然它適用於我的機器,但我可能根本沒有使用共享程序選項庫。在我的筆記本電腦上,我的庫路徑中可能使用了libboost_program_options的靜態版本,以及可能位於我的include路徑中的庫外的program_options.hpp頭。我覺得我應該能夠使用服務器上的共享庫,而不是惹惱第五次服務器管理員(事情在這裏真的很慢)。

對不起,如果這是我的疏忽。我很興奮,但我覺得現在我已經嘗試了一切來解決這個問題。

我很樂意提供任何有關如何改變這種情況的建議......或者如果我只是在使用共享庫時感到有點愚蠢。

在此先感謝。

編輯: 經過更多的研究,我覺得我只是在靜態和共享庫之間感到困惑。我試圖在編譯時鏈接一個共享庫,我認爲這沒有意義。還包括在編譯時不應該鏈接的東西的頭文件沒有什麼意義。我的代碼顯然是爲靜態庫設計的。

+1

'g ++ -I/usr/include -L/usr/lib64 -lboost_program_options -std = C++ 11 ...' –

+0

您的服務器可能沒有'program_options.hpp',它應該在一些名爲boost_program_options _ ** devel **的軟件包。 – Mine

+0

是的,那是我的問題。我想我可以沒有它,但似乎並非如此。我現在只是在我的筆記本電腦上鍊接了一個靜態版本的程序選項,並使用服務器上的可執行文件。它工作到目前爲止..但我覺得我應該能夠得到這個在服務器上編譯以及。我現在已經下載了頭文件,它決定它找不到libboost_program_options.so,儘管我已經創建了一個符號鏈接到我正在運行的同一個目錄中...好玩^^ – LuckyM

回答

0

錯誤消息是由預編譯器生成的,它沒有找到Boost頭文件(如錯誤消息中所述)。您需要設置找到Boost庫頭文件的正確包含路徑(-I...),顯然它們不在/usr/include之下。

必須相應地指定Boost庫(-L...)的路徑。

最後:如果您正在鏈接系統上的Boost共享庫,那麼您應該使用與服務器上安裝的Boost相同版本的Boost。否則,請與靜態庫鏈接,這可能會使您的可執行文件變大,但它可以在任何服務器上運行,而不管在那裏安裝了何種Boost版本(甚至沒有)。

+0

因此要澄清,要使用boost程序選項我需要頭文件和共享庫對象?我認爲共享庫對象可能包含頭文件和我想調用的函數的代碼。我之前沒有清楚地使用共享庫... 我正在重新編譯時切換到服務器,但它可能是一個好主意,只是鏈接到我的系統上的靜態庫並使用服務器上的可執行文件。這可能會節省很多痛苦。 – LuckyM

+0

謝謝,我只是下載頭文件,現在我有一個錯誤,我可以更好地工作。無法找到-lboost_program_options。奇怪要對一個錯誤感到高興。但至少我在網上某個地方見過這個。 – LuckyM

+0

要進行編譯,您需要頭文件和共享庫。要運行該程序,您只需要共享庫。實際上,如果需要共享庫中的真正符號,則只需要共享庫,但Boost庫中的許多內容僅在頭文件中,因此直接編譯到您的可執行文件中。 – Rene