首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

qmake SUBDIRS + prl 依賴順序陷阱:main 讀取 lib prl 失效的根因與解法

     編輯:關於C語言

項目結構


project.pro
main/main.pro   (CONFIG += link_prl)
lib/lib.pro     (CONFIG += create_prl)

project.pro 內容:


TEMPLATE = subdirs
SUBDIRS = main lib
main.depends = lib

錯誤現象

  • lib 成功生成 .prl 與動態庫;
  • main 編譯時未讀取到 lib 的 prl 內容,鏈接失敗或缺少符號。

根因深度分析

  1. qmake 階段:link_prl 在 qmake 時解析依賴項的 .prl 文件,將庫路徑、依賴庫等信息注入生成的 Makefile;
  2. SUBDIRS 構建順序:project.pro 生成的 Makefile 包含:
    sub-main: main/$(MAKEFILE) sub-lib
    即 先對 main 執行 qmake 生成 Makefile,再構建 lib;
  3. 時序衝突:main 執行 qmake 時,lib 的 .prl 尚未產生(lib 尚未進入 qmake),導致 main 讀取不到任何依賴信息。

解決方案

調整 SUBDIRS 順序,將 lib 置前:


SUBDIRS = lib main
main.depends = lib

此時 Makefile 變為:


sub-lib: lib/$(MAKEFILE)
sub-main: main/$(MAKEFILE) sub-lib

lib 先 qmake 並生成 prl,main 再 qmake 時即可正確讀取。

避坑指南

  • 使用 create_prl/link_prl 時,**被依賴庫必須在 SUBDIRS 中排在前面**;
  • 或改用 CONFIG += ordered 顯式聲明順序依賴(Qt 5 支持);
  • 大型專案建議拆分為獨立庫專案,通過 include(../lib/lib.pri) 引入,避免 SUBDIRS 時序問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved