解读.pro文件
pro文件:QT widgets TEMPLATE app TARGET ChartViewer CONFIG c11 CONFIG - app_bundle QMAKE_CXXFLAGS -finput-charsetUTF-8 -fexec-charsetUTF-8 isEmpty(SDK_ROOT): SDK_ROOT $$PWD/../Enclib !exists($$SDK_ROOT/include/encl.h): error(SDK_ROOT must contain include/encl.h) INCLUDEPATH $$quote($$SDK_ROOT/include) $$PWD/src $$PWD win32 { DEFINES __MSW__ LIBS $$quote($$SDK_ROOT/bin/libenccore.dll.a) } linux { DEFINES __LINUX__ isEmpty(SDK_LIB_DIR) { exists($$SDK_ROOT/lib/libenccore.so): SDK_LIB_DIR $$SDK_ROOT/lib else:exists($$SDK_ROOT/lib64/libenccore.so): SDK_LIB_DIR $$SDK_ROOT/lib64 else: SDK_LIB_DIR $$SDK_ROOT/bin } !exists($$SDK_LIB_DIR/libenccore.so): error(Set SDK_LIB_DIR to the Linux directory containing libenccore.so) LIBS -L$$quote($$SDK_LIB_DIR) -lenccore # Optional additional libraries required by a particular SDK build. LIBS $$SDK_EXTRA_LIBS } SOURCES $$PWD/main.cpp \ $$PWD/src/sdk/chartsdksession.cpp \ $$PWD/src/ui/chartcanvas.cpp \ $$PWD/src/ui/shipmarker.cpp \ $$PWD/src/ui/chartviewerwindow.cpp HEADERS $$PWD/src/sdk/chartsdksession.h \ $$PWD/src/ui/chartcanvas.h \ $$PWD/src/ui/shipmarker.h \ $$PWD/src/ui/chartviewerwindow.hCONFIG - app_bundle- app_bundle移除macOS 应用包选项对目前的Windows/Linux用途基本没有影响。QMAKE_CXXFLAGS -finput-charsetUTF-8 -fexec-charsetUTF-8两个字符集参数让GCC/MinGW按 UTF-8 处理源码和字符串便于使用中文。isEmpty(SDK_ROOT): SDK_ROOT $$PWD/../Enclib如果没有指定SDK_ROOT就默认使用.pro 所在目录的上一级目录中的 Enclib。其中SDK_ROOT我们自己定义的变量。isEmpty(...)判断变量是否为空。:条件成立时执行后面的语句。$$PWD当前.pro文件所在目录。$$变量名取出变量的值。所以默认路径对应ChartViewPlugin/ ├─ Enclib/ └─ standalone/ └─ ChartViewer.proSDK_ROOT:就是我在shell中传入的参数吧。。。。。。。。。!exists($$SDK_ROOT/include/encl.h): error(SDK_ROOT must contain include/encl.h)!表示取反如果找不到encl.h就停止生成工程并报错。INCLUDEPATH $$quote($$SDK_ROOT/include) $$PWD/src $$PWD告诉编译器去这些目录寻找头文件。这样代码中才能写#include encl.h #include sdk/chartsdksession.h$$quote(...)用来给路径加引号帮助处理包含空格的路径。win32 { DEFINES __MSW__ LIBS $$quote($$SDK_ROOT/bin/libenccore.dll.a) }win32 { ... }表示这部分只在构建 Windows 程序时生效并不只是指 32 位 Windows。DEFINES __MSW__相当于向编译器传入#define __MSW__SDK 头文件据此选择 Windows 的接口声明方式。LIBS .../libenccore.dll.a链接 Windows SDK 的导入库。它帮助链接器找到接口运行时仍需要实际的enccore.dll。linux { DEFINES __LINUX__ isEmpty(SDK_LIB_DIR) { exists($$SDK_ROOT/lib/libenccore.so): SDK_LIB_DIR $$SDK_ROOT/lib else:exists($$SDK_ROOT/lib64/libenccore.so): SDK_LIB_DIR $$SDK_ROOT/lib64 else: SDK_LIB_DIR $$SDK_ROOT/bin } !exists($$SDK_LIB_DIR/libenccore.so): error(Set SDK_LIB_DIR to the Linux directory containing libenccore.so) LIBS -L$$quote($$SDK_LIB_DIR) -lenccore # Optional additional libraries required by a particular SDK build. LIBS $$SDK_EXTRA_LIBS }如果你没有指定SDK_LIB_DIR就依次查找SDK_ROOT/lib/ SDK_ROOT/lib64/ SDK_ROOT/bin/寻找libenccore.so。LIBS -L$$quote($$SDK_LIB_DIR) -lenccore写法含义-L某个目录到这个目录寻找库-lenccore链接名为enccore的库通常对应libenccore.soLIBS $$SDK_EXTRA_LIBS用于追加某个 SDK 版本需要的其他库。没有指定时就是空的。注意-L设置的是链接时的搜索路径不保证运行时也能找到.so。这个.pro负责“如何编译和链接”