我的Linux知識是非常有限的
我會假設你正在使用Windows dll
s,這是類似於到Linux .so
S比或不太熟悉的(共享對象)。
共享對象可以在不同的程序之間共享(因此是名稱)。在大多數情況下,加載可執行文件時,庫也會加載到內存中。您可以使用ldd
查看這種依賴關係。
靜態庫(或靜態鏈接庫,或靜態可執行文件,或其他)是在編譯時嵌入在可執行文件中的庫。爲了靜態鏈接你的庫,你需要重建你的可執行文件,並鏈接一個.a
靜態庫文件,這與Windows上的.lib
文件類似(使用Visual Studio編譯器,至少是IIRC)。
這可能很麻煩並且很費時間。這就是爲什麼我建議你採取另一條路線:
在Windows上,.dll
與可執行文件共享相同文件夾的文件被賦予比路徑(IIRC)更高的優先級。在Linux(通常是UNIX)上,這被認爲是一個安全漏洞,因爲有人可能很容易丟棄一個流氓.so
文件並改變程序的行爲。但是,您可以使用兩個環境變量來控制此行爲:LD_LIBRARY_PATH
和LD_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或其他類似軟件感興趣。
非常感謝您的回覆!第一部分很清晰! 我有一個問題:最後一位將wkhtmltopdf libs文件夾添加到整個服務器的搜索路徑(如修改窗口上的PATH)?或只爲wkhtmltopdf庫? – Hyti
我編輯了我的答案以回答您的評論 – MayeulC
感謝所有的信息,我會開始並嘗試使其工作! – Hyti