目录
最近工作中遇到问题记录:在不同系统、架构中调用不同库文件的问题,研究了一下,总结记录如下:
说明:这里只是基于本人额现有环境,以及项目需求所写,若不完整,欢迎批评指正,共同进步:
1、系统测试环境
系统(现有环境) | 系统类型(CPU架构) | 查看命令 |
windows | x64-based PC(AMD) | syateminfo |
fangde-linux-ubuntu | x86_64(AMD) | uname -a |
龙芯麒麟(mips) | mips64(MIPS) | uname -a |
2、.pro中常用的相关字段总结
变量 | 含义 |
TARGET | 生成目标的名字 |
DESTDIR | 目标输出文件路径 |
PWD | 当前文件(.pro或.pri)所在的路径 |
OUT_PWD | Makefile生成的路径 |
PRO_FILE_PWD | pro项目文件所在的路径 |
QMAKE_HOST.arch | 计算机架构 |
QMAKE_HOST.os | 计算机系统 |
QMAKE_HOST.cpu_count | 计算机CPU核心数 |
QMAKE_HOST.name | 计算机名 |
QMAKE_HOST.version | 系统版本(数字形式) |
QMAKE_HOST.version_string | 系统版本(字符串形式) |
QMAKE_POST_LINK | 编译链接后自动执行命令 |
DEFINES | 编译器定义的预处理器宏,类似于gcc -D 选项 |
INCLUDEPATH | 包含头文件路径 |
LIBS | 指定要链接到项目中的库 |
3、.pro中添加模板
#说明 contains(QMAKE_HOST.arch, x86)
#函数原型为contains(variablename, value),如果 variablename 包含 value 则返回成功
#QMAKE_HOST.arch:qmake变量,计算机架构
#x86_64:终端输入 lscpu 可以参看当前计算机架构,x86 是 x86_64,arm64 是 aarch64,或者直接 message($$QMAKE_HOST.arch) 输出到概要信息
CONFIG(debug, debug|release):{ #处理debug
message("Msg_Debug")
win32{
message("win32")
}else:unix{
contains(QMAKE_HOST.arch, x86_64){
message("x86_64")
}else:contains(QMAKE_HOST.arch, aarch64){
message("aarch64")
}else:contains(QMAKE_HOST.arch, mips64){
message("mips64")
}
}
}else:CONFIG(release, debug|release):{ #处理release
message("Msg_release")
win32{
message("win32")
}else:unix{
contains(QMAKE_HOST.arch, x86_64){
message("x86_64")
}else:contains(QMAKE_HOST.arch, aarch64){
message("aarch64")
}else:contains(QMAKE_HOST.arch, mips64){
message("mips64")
}
}
}
4、示例
CONFIG(debug, debug|release):{ #处理debug
message("Msg_Debug")#输出目录
DESTDIR += $$PWD/../Output/debugwin32{
message("win32")#依赖库目录
LIBS += -L$$PWD/ThridPart/Test/ -lTestDLL1
LIBS += -L$$PWD/ThridPart/Test -lTestDLL2
LIBS += -L$$PWD/ThridPart/Test -lTestDLL3#库文件拷贝
{ OutputDir = $$replace(DESTDIR, /, \\)TargetDll_1 = $$PWD/ThridPart/Test/TestDLL1.dll
TargetDll_1 = $$replace(TargetDll_1, /, \\)
QMAKE_PRE_LINK += copy $$TargetDll_1 $$OutputDir &TargetDll_2 = $$PWD/ThridPart/Test/TestDLL2.dll
TargetDll_2 = $$replace(TargetDll_2, /, \\)
QMAKE_PRE_LINK += copy $$TargetDll_2 $$OutputDir &TargetDll_3 = $$PWD/ThridPart/Test/TestDLL3.dll
TargetDll_3 = $$replace(TargetDll_3, /, \\)
QMAKE_PRE_LINK += copy $$TargetDll_3 $$OutputDir &
}
}else:unix{
contains(QMAKE_HOST.arch, x86_64){
message("x86_64")}else:contains(QMAKE_HOST.arch, aarch64){
message("aarch64")}else:contains(QMAKE_HOST.arch, mips64){
message("mips64")}
}
}else:CONFIG(release, debug|release):{ #处理release
message("Msg_release")#输出目录
DESTDIR += $$PWD/../Output/releasewin32{
message("win32")}else:unix{
contains(QMAKE_HOST.arch, x86_64){
message("x86_64")}else:contains(QMAKE_HOST.arch, aarch64){
message("aarch64")}else:contains(QMAKE_HOST.arch, mips64){
message("mips64")}
}
}