简体   繁体   English

如何检测Qt Creator的目标(调试/发布)(Visual Studio)

[英]How to detect Qt Creator's target (debug/release) (Visual Studio)

So I use qmake to create my program, but I'm always having a conflict between my debug and release boost libraries with the message: 所以我使用qmake来创建我的程序,但是我的调试和发布boost库之间始终存在冲突:

libboost_system-vc120-mt-s-1_58.lib(error_code.obj):-1: error: LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj

I would like to make this automated, in such a way where choosing debug or release from Qt Creator suffices to create the correct version. 我想以自动化方式实现这一点,从Qt Creator中选择调试或发布就足以创建正确的版本。 I saw other solutions like the one here , but that doesn't work. 我看到其他的解决方案,如一个在这里 ,但是,这并不工作。 The reason why it doesn't work can be seen when calling the following command for both debug and release: 调试和发布时调用以下命令时,可以看到它不起作用的原因:

message($$CONFIG)

which will print the configuration of qmake. 这将打印qmake的配置。 The results are the following: 结果如下:

For release: 发布:

lex yacc debug exceptions depend_includepath testcase_targets import_plugins import_qpa_plugin rtti_off incremental_off windows qt warn_on release link_prl incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe c++11 debug static rtti no_plugin_manifest qpa win32 msvc copy_dir_files release lex yacc调试异常depend_includepath testcase_targets import_plugins import_qpa_plugin rtti_off incremental_off windows qt warn_on release link_prl incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe c ++ 11 debug static rtti no_plugin_manifest qpa win32 msvc copy_dir_files release

For Debug: 对于调试:

lex yacc debug exceptions depend_includepath testcase_targets import_plugins import_qpa_plugin rtti_off incremental_off windows qt warn_on release link_prl incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe c++11 debug static rtti no_plugin_manifest qpa win32 msvc copy_dir_files lex yacc调试异常depend_includepath testcase_targets import_plugins import_qpa_plugin rtti_off incremental_off windows qt warn_on release link_prl incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe c ++ 11 debug static rtti no_plugin_manifest qpa win32 msvc copy_dir_files

Notice that both contain debug and release... and I'm wondering why... 请注意, 两者都包含调试和释放......我想知道为什么......

I would like to point out that I compiled this Qt version from source. 我想指出我从源代码编译了这个Qt版本。 But there was no weird stuff when I did that. 但是当我这样做时,并没有奇怪的东西。 I used the following command to compile it (configure then compile with simple nmake): 我使用以下命令编译它(配置然后用简单的nmake编译):

configure -debug-and-release -opensource -platform win32-msvc2013 -opengl desktop -static -nomake examples -nomake tests

I tried a dull solution by adding the command: debug:CONFIG-=release in my make file, but that will cause the release version to become debug with 30 MB size instead of 14 MB when I choose release from Qt Creator. 我尝试了一个枯燥的解决方案,在我的make文件中添加了命令: debug:CONFIG-=release ,但是当我从Qt Creator中选择发布时,这将导致发行版本以30 MB大小而不是14 MB进行调试。

My qmake file is a typical one. 我的qmake文件是一个典型的文件。 The following is the part that could have anything to do with the problem. 以下是可能与问题有关的部分。 The other parts are just adding files and libraries and paths: 其他部分只是添加文件和库和路径:

QMAKE_CFLAGS += /MT

QT       += core gui

unix:QMAKE_CXXFLAGS += -std=c++11

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = MyProg
TEMPLATE = app

So why is this problem happening? 那么为什么会出现这个问题呢? Why are my debug or release a debug and release? 为什么我的调试或发布是调试和发布? How can I distinguish between them? 我该如何区分它们?

Please ask if you require any additional information. 请询问您是否需要任何其他信息。

The answer is I think in Qt project org faq 355 答案是我认为在Qt项目org faq 355中

If you always accept the name Qt Creator suggests for your build you can use the following simple solution in your pro files that in my case (Qt 5.5) works for Linux, Mac and Windows: 如果您始终接受Qt Creator为您的构建建议的名称,您可以在您的案例中使用以下简单的解决方案(Qt 5.5)适用于Linux,Mac和Windows:

# to distinguish between debug and release executable as target
# we define the variables releaseExec and debugExec
# this only works if the $$OUT_PWD has "Release" in its name
BDIR = $$OUT_PWD
BDIR_STRIPPED = $$replace(BDIR,Release,)
equals (BDIR,$$BDIR_STRIPPED): CONFIG+= debugExec
else: CONFIG+= releaseExec

We used the variables releaseExec and debugExec to avoid name collisions with Qt CONFIG variables. 我们使用的变量releaseExecdebugExec以避免名称冲突使用Qt CONFIG变量。

You can now use the switch statements: 您现在可以使用switch语句:

releaseExec: warning ("this is a release build")
debugExec: warning ("this is a debug build")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM