2010-09-10 60 views
31

雖然我是Linux新手,但我並不是C++新手。我正在使用CMake預編譯與第三方的跨平臺遊戲引擎,但我對使用庫有許多疑問。我的問題是如何與第三方庫合作。並在哪裏把這個庫。 Apt將libs安裝在他們的官方位置(/ usr/local,/ usr/lib/..),但我使用本地庫中的本地庫進行開發,這些庫位於我的項目目錄中。哪裏可以放置第三方庫來設置C++ linux開發環境?

此外,我需要一個很好的教程來了解圖書館工作的規則。例如:當試圖編譯我的項目時,luabind正在問liblua.s0.1,但是AFAIK沒有辦法用lua提供的源代碼生成這個庫(至少是make,make install)。

我知道,這個問題很模糊,但我沒有足夠的經驗來簡化。

更新:閱讀sombe的答案後,一個更簡潔的問題如下。如果我安裝了所有第三方庫,我該如何分發我的程序?如何在不使用大型自述文件的情況下管理依賴關係?

感謝所有強大的文本

+0

LUA庫將是'liblua.so.1',而不是'liblua.s0.1'。 – 2010-09-10 15:20:54

回答

47

放在哪裏庫

最好的解決方法是使用Linux發佈版的包裝系統(apt-getyum或類似)從發行版提供的軟件包安裝庫儘可能。

如果發行版的打包庫的版本不夠新,或者您需要某些非標準構建選項,或者需要發行版不提供的庫,則可以自行構建並安裝它。您有地方放庫中有兩個主要的選項:

  • /usr/local/usr/local/lib下庫,標題/usr/local/include下)。這將在系統範圍內安裝庫,並且可能是最簡單的解決方案,因爲您應該可以在不採取任何額外步驟的情況下針對它們進行構建。請勿直接在/usr下安裝庫,因爲這會干擾您的發行版的打包系統。
  • 在您的項目目錄下,就像在Windows下一樣。這具有不需要root訪問權限和不進行系統範圍更改的優點,但是您必須更新項目的包含路徑和庫路徑,並且必須將任何共享庫文件放置在dynamic linker可以找到它們的地方(使用LD_LIBRARY_PATHld.so.conf - 詳情請參閱鏈接)。

庫的工作原理

見David A.惠勒的優秀Programming Library HOWTO。我建議閱讀,然後發佈任何具體問題作爲新主題。

如何分配你的程序

傳統的Unix/Linux程序不包括它們的依賴的副本。而是由最終用戶或開發人員自行安裝這些依賴關係。這可能需要一個「大自述,」像你說的,但它有幾個優點:

  • 開發庫可以安裝,管理,並通過發行版的包管理器更新,而不是有其自身的每個源副本跟蹤一組庫。
  • 系統上只有一個給定庫的副本,所以只有一個地方需要更新,例如,如果發現安全漏洞。 (例如,考慮到zlib是一個非常廣泛使用的壓縮庫,結果發現它有一個security flaw,所以包含受影響版本的每個應用程序都需要更新)導致的混亂。)
  • 如果您的程序足夠流行並且是開源的或者至少可以免費獲得的),那麼各種Linux發行版的軟件包維護者可能想要打包並將其包含在他們的發行版中。軟件包維護人員真的不喜歡捆綁庫。例如參見Fedora's page on the topic

如果你發佈你的程序給最終用戶,你可能需要考慮提供包(.dpkg.rpm),他們可以簡單地下載和安裝,而不必使用源。理想情況下,從最終用戶的角度來看,該軟件包將被添加到發行版的存儲庫(如果它是開源的或至少免費提供的),以便用戶可以使用其軟件包管理器(apt-getyum)下載它。這可能會變得複雜,因爲那裏有大量的Linux發行版,但與Debian/Ubuntu兼容的.dpkg和Red Hat/CentOS/Fedora兼容的.rpm應該覆蓋很大一部分最終用戶。建設軟件包不是太難,網上有很好的howtos。

+1

我喜歡'/ opt' and stow – Anycorn 2010-09-10 15:23:46

+0

偉大的起點!我試圖在Windows中做同樣的事情。我的意思是:如果你有一個clena VC++ instalation,你可以編譯我的項目,因爲所有的庫都在一起。在Linux中,我想要的是一樣的。我會閱讀如何。非常感謝!!! – Killrazor 2010-09-10 20:25:08

+1

對於每個人都使用它的正常情況,我同意/ usr/local/X,但是當我正在爲我自己構建和調試(很多)的庫時(即使我是唯一使用該系統的人)把它們放在〜/ local/X中 – 2010-09-11 03:48:17

1

好了,這是基本的問題之一,而我自己可能不會遇到這個很清楚,這裏有雲:

  1. 雖然建設項目,你的編譯器需要找到這些庫的頭文件。標題必須位於包含路徑中。
  2. 編譯完成後,鏈接器將查找庫二進制文件(files.so或類似的東西)。這些必須位於庫路徑中。

這就是基礎知識。

如果您有一些特定的庫,可以將它們添加到您自己的項目特定的lib/include/目錄中,並分別將它們添加到包含路徑和庫路徑。

將這些目錄添加到這些路徑可以以多種方式完成,具體取決於您如何構建項目。我確信在所有這些方面都有一個叫做LD_PATH的東西......但我並不真正瞭解與CMake有關的細節。

有點谷歌搜索可以幫助你用CMake做到上述。

希望幫助,
JRH

+0

對我來說,把libs放在/ usr/include中就像在VC++的全局路徑選項中添加目錄一樣。在我的所有程序中,我將所有第三方庫放入我的項目文件夾中,然後配置項目(在VC++中非常簡單)。後來,如果我需要分發我的項目,只需要一個乾淨的VC++安裝並執行存儲庫檢出就足以編譯我的項目。至少在窗口中。它正是我想要的。 – Killrazor 2010-09-10 20:48:47

1

如果您正在使用的軟件包管理器中安裝庫,他們可能會在所有正確的地方結束。如果沒有,您可以通過使用-L <path>標誌提供額外的搜索路徑來讓編譯器搜索。你應該能夠將這個額外的標誌傳遞給CMake。

順便提及-I <path>可用於添加額外的目錄來搜索包含文件。

1

關於Windows的問題的第一部分:在Windows上沒有真正的庫/標頭的標準位置,所以簡單的解決方案是:創建您自己的。只需在系統上提供一個lib /和include /,讓所有項目都可以使用它(通過在任意位置包含的cmake文件中設置路徑)。把所有的第三方庫在那裏,例如:

您的項目:

d:/projects/projectA 
d:/projects/projectB 

第三方的東西:

d:/api/lib/lua.lib 
d:/api/include/lua/.... 

(你甚至可以使用符號連接又名「目錄連接」,如果你有不同版本)

和相應的cmake文件:

include_directories(d:/api/include) 
link_directories(d:/api/lib)