2016-12-01 71 views
0

早上好。大家。(qt/embedded)如何在運行程序之前加載庫

我正在使用qt 4.8。 (嵌入式Linux) 服務器應用程序正在使用qprocess()執行客戶端應用程序。此時,客戶端應用程序的加載速度很慢,因此係統在用戶看到它時似乎處於暫停狀態。

我認爲緩慢的原因是將外部庫加載到內存中的時間。所以我想知道當服務器應用程序經過init進程時是否有預先加載客戶端應用程序使用的庫的方法。

請讓我知道是否有更好的方法。謝謝。

+0

您可以嘗試使用QLibraby在第一個程序中加載它。不知道這是否是最好的方法。 –

+0

@DragosPop QLibrary將共享庫加載到當前進程中,所以在這裏不起作用。 – MrEricSir

+0

我知道,它可能有助於緩存庫。無論如何,我找到了一個麪糊解決方案。看到我的回答。 –

回答

1

因爲其他應用程序必須在啓動時加載它自己的庫,所以這不是一件容易的事情,但是您可以通過準備所需的應用程序及其庫來從ramdisk加載而不是從硬盤加載來避開緩慢加載-disk。

在主應用程序使用安裝

sudo mount -t tmpfs -o size=200M none /mnt/ramdisk 

拷貝所有需要的文件了,併成立$LD_LIBRARY_PATH爲環境指向您的ramdisk創建一個RAM磁盤(QT)

auto env = QProcess::systemEnvironment(); 
env.insert("LD_LIBRARY_PATH","/mnt/ramdisk"); 

設置新環境作爲您QProcess的環境。由於我不是100%確定,因此會從此處加載您的庫,作爲替代,您可以在chroot環境中創建一個chroot環境和設置庫/usr/lib

這個想法是將從RAM加載的庫和應用程序加載到RAM中,這比從磁盤加載要快得多。

+0

感謝您的回答。我認爲這是一個好主意。我以這種方式做了測試。我將qt應用程序執行所需的qt庫移至ramdisk。 A應用程序的執行速度顯着提高。但是,在A應用程序中使用QProcess()執行的B應用程序的執行速度是相同的。 – Taey

+0

如果你對應用程序打開文件描述符,你可能會看到應用程序仍然試圖從磁盤而不是RAMdisk加載庫。這就是linux的共享庫概念及其搜索和加載優先級路徑。檢查'ld.so.conf'。 –

相關問題