2016-09-18 55 views
1

對於我的一個網站,我試圖讓wkhtmltopdf(Link)的工作。該網站託管在共享主機上,使用未安裝的庫時有點麻煩。構建一個linux靜態庫

經過幾次試圖與多個版本的庫(一些應該是靜態的,但我仍然有關於共享庫的錯誤沒有找到)我最終聯繫提供商,誰告訴我,如果我有庫的靜態版本。

問題是,我的linux知識非常有限。 如果我理解正確,靜態庫應該是wkhtmltopdf的一個版本,一個單獨的文件,包括所有的依賴關係?

隨着官方網站提到的優勢如下:zlib的,fontconfig的是,FreeType,X11庫(的libx11,libXext,libXrender)

第二個問題是,你能指出我在那裏我能找到一個循序漸進的指南建立這樣的圖書館?作爲我的研究是不成功的,到目前爲止..

回答

2

我的Linux知識是非常有限的

我會假設你正在使用Windows dll s,這是類似於到Linux .so S比或不太熟悉的(共享對象)。

共享對象可以在不同的程序之間共享(因此是名稱)。在大多數情況下,加載可執行文件時,庫也會加載到內存中。您可以使用ldd查看這種依賴關係。

靜態庫(或靜態鏈接庫,或靜態可執行文件,或其他)是在編譯時嵌入在可執行文件中的庫。爲了靜態鏈接你的庫,你需要重建你的可執行文件,並鏈接一個.a靜態庫文件,這與Windows上的.lib文件類似(使用Visual Studio編譯器,至少是IIRC)。


這可能很麻煩並且很費時間。這就是爲什麼我建議你採取另一條路線:

在Windows上,.dll與可執行文件共享相同文件夾的文件被賦予比路徑(IIRC)更高的優先級。在Linux(通常是UNIX)上,這被認爲是一個安全漏洞,因爲有人可能很容易丟棄一個流氓.so文件並改變程序的行爲。但是,您可以使用兩個環境變量來控制此行爲:LD_LIBRARY_PATHLD_PRELOAD。第二個是更強大一點,只是某種「dll」注入。然而,第一個控件將搜索.so文件的路徑。

因此,我建議您使用ldd查找所需的依賴關係,如果可以,請在服務器上再次執行此操作。尋找每個缺失的.so文件。您可以通過發出命令ldd wkhtmltopdf | grep not found來完成。

一旦你有這個缺失庫的列表,將它們捆綁在一起併發送到你的服務器上(注意它們也可以有一些依賴關係)。您可能可以在本地Linux上匹配的體系結構上找到它們,但我鼓勵您嘗試將該分發與您的提供程序匹配。

然後,在設置LD_LIBRARY_PATH環境變量後發出wkhtmltopdf調用。你能做到像這樣:

LD_LIBRARY_PATH='/home/me/my_libs':$LD_LIBRARY_PATH /home/me/programs/wkhtmltopdf 

注意,我附上老LD_LIBRARY_PATH變量在最後。它幾乎沒有開箱,但至少你不應該有任何問題,如果你這樣做。這再次明確這的確是一個有點像修改Windows上的PATH(只是爲了:


爲了回答您的評論在Linux上,你有同樣的PATH環境變量,但它僅適用於可執行文件搜索路徑;因此我們正在更改另一個LD_LIBRARY_PATH環境變量以指定庫搜索路徑)。

請注意,在上面的例子中,我沒有改變它在系統範圍內,但只爲調用wkhtmltopdf。在Windows上,有多種方法可以更改環境變量PATH。您可以打開專用gui,它將更改路徑變量in the registry。但是,您也可以在命令提示符或批處理腳本中在本地覆蓋它。這正是我在這裏所做的。

一旦導出了LD_LIBRARY_PATH,它將用於您調用的每個程序,因此如果您有一些不兼容的情況,將其設置爲系統範圍可能會很危險。此外,無論您嘗試什麼,如果您沒有root訪問權限,您將無法在系統範圍內設置它。所以,你最多隻會影響你的程序。

作爲最後一點,您可能會對該項目產生很多依賴關係,因爲它是基於Qt的。如果你想靜態重建它,你必須先用-static構建Qt。下一次,您可能會對一些容器化技術感興趣,比如碼頭工(甚至是appimages/flatpack/snap),該工具旨在解決這類問題。

想要進一步閱讀Linux上的動態鏈接庫,您可能對this resource或其他類似軟件感興趣。

+0

非常感謝您的回覆!第一部分很清晰! 我有一個問題:最後一位將wkhtmltopdf libs文件夾添加到整個服務器的搜索路徑(如修改窗口上的PATH)?或只爲wkhtmltopdf庫? – Hyti

+0

我編輯了我的答案以回答您的評論 – MayeulC

+0

感謝所有的信息,我會開始並嘗試使其工作! – Hyti