Qt小技巧13.如何爲程序設置環境變量?

1 說下背景

有時會有這樣一種場景,我寫了個程序,該程序依賴一些第三方的動態庫,假如現在將三方庫放到了可執行文件同級目錄下的dependence目錄,現在我將程序打包好併發給了用戶。此時用戶是無法直接執行可執行程序的,因爲找不到依賴的三方庫文件。
有人會說了直接將三方庫全部放到可執行文件同級目錄下不就行了?
這樣確實沒問題,但是如果依賴的三方庫特別多呢,統一放到dependence目錄下分類管理豈不更好,不但結構清晰,維護起來也相對更容易。
此時又有人會說了,設置個環境變量不就可以了?
如果不嫌麻煩的話確實可以,我們的目標是用戶無需做任何額外操作,直接就可以運行程序,儘可能不要讓用戶用着噁心。

2 舉個例子

先說一下,Qt中主要使用qputenv函數來設置環境變量。

bool qputenv(const char *varName, const QByteArray &value)

這裏假如有個程序叫target.exe,它依賴的dependence目錄下的三方庫,需要注意的是,target.exe程序裏面設置環境變量是不行的,因爲程序運行前就需要知道依賴的三方庫。
這時需要寫另一個程序,這裏假如叫launch.exe,來爲target.exe設置環境變量並啓動它,launch.exe此時的不僅可以管理target.exe的環境變量,還能夠管理其生命週期。代碼如下:

#include <QApplication>
#include <QProcess>
#include <QDir>

void initializeEnv();

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    initializeEnv();

    QProcess process;
    QObject::connect(&process, QOverload<int>::of(&QProcess::finished), &a, &QApplication::quit);
    process.start("target.exe");

    return a.exec();
}

void initializeEnv()
{
    QString envPath = qgetenv("PATH");

    QString appDirPath = QApplication::applicationDirPath();
    QString dependencePath = appDirPath + "/dependence";

    envPath += QDir::toNativeSeparators(dependencePath).prepend(';');

    qputenv("PATH", envPath.toStdString().c_str());
}

這樣通過運行launch.exe來間接運行target.exe後,target.exe便擁有了指定的環境變量。

3 對比一下

直接運行target.exe,打印結果如下:

通過launch.exe間接運行target.exe,打印結果如下:

結果是特別顯然的,這時就不用去手動配置環境變量了,直接就可以運行,用戶體驗棒棒的。

4 下載

示例程序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章