【问题标题】:qmake: handling options for both gcc and msvcqmake:gcc 和 msvc 的处理选项
【发布时间】:2013-08-22 04:38:08
【问题描述】:

我想制作一个可以同时使用 msvc 和 gcc 的项目文件。

例如,为了优化速度,您可以使用 cl /O2g++ -O3

但我不知道如何告诉项目文件有所作为。我想要类似的东西:

msvc:QMAKE_CXXFLAGS_RELEASE += /O2 /openmp /arch:AVX
else:QMAKE_CXXFLAGS_RELEASE += -O3 -march=native -fopenmp -D_GLIBCXX_PARALLEL

可悲的是,这不起作用。

另一种方法是更改​​ mkspecs 并将新的 mkspecs 与我的应用程序捆绑在一起,但它不是很便携。 谢谢!

【问题讨论】:

  • 有什么问题?你说“它不起作用”是什么意思?
  • 您是否尝试过像文档中描述的那样使用 win32!win32 之类的范围? qt-project.org/doc/qt-4.8/qmake-advanced-usage.html
  • 如果我在我的项目文件中添加我之前放置的代码,我仍然会有:cl -O3 -march=native -fopenmp -D_GLIBCXX_PARALLEL 而我想要cl /O2 /openmp /arch:AVX
  • @Jean-MichaëlCelerier 奇怪。我刚刚制作了一个简单的 .pro 文件,其中包含您问题中的两行并添加了另一行:message($${QMAKE_CXXFLAGS_RELEASE})。当我运行 qmake 时,我得到这个:Project MESSAGE: -O2 -MD /O2 /openmp /arch:AVX 这很好,因为我的环境是 Win7 + MSVC2010。你的环境是什么?
  • 嗯。诡异的。我想我应该再运行 qmake 一到两次才能确定,因为现在它可以工作了。谢谢!

标签: c++ qt visual-c++ g++ qmake


【解决方案1】:

Jean,准确地说,你应该根据你的描述使用这个:

msvc:QMAKE_CXXFLAGS_RELEASE += /O2 /openmp /arch:AVX
gcc:QMAKE_CXXFLAGS_RELEASE += -O3 -march=native -fopenmp -D_GLIBCXX_PARALLEL

【讨论】:

  • 对!是否有编译器在某处定义的列表?就像有一天我想使用 clang ? (即使我认为这些选项与 gcc 兼容,不是吗?)
  • @Jean-MichaëlCelerier:是的,你是对的:至少目前,Clang 尝试让选项与 gcc 兼容,所以只要你不使用任何外来选项应该没有问题... ;)
  • @Jean-MichaëlCelerier:根据您的第一个问题:我一直在寻找 qmake 的编译器范围列表几分钟(我也需要它)但找不到任何东西:/ 但通过反复试验,我发现 MinGW 只是“mingw”(与“gcc”和“msvc”完全一样 -> 很容易猜到);所以对于铿锵声,我很有信心它是“铿锵声”;)编辑:这可能会有所帮助:stackoverflow.com/questions/14523148/…
  • @mozzbozz:题外话,但您可以在 mkspecs 中查找 QMAKE_COMPILER 变量。顺便说一句,“mingw”似乎是一个平台,而不是编译器,但是是的,它会起作用。在这种情况下,QMAKE_PLATFORM 是关键字。
【解决方案2】:

这是我一直在使用的项目文件。它适用于 Windows (msvc) 和 Linux (gcc)

QT = core gui widgets

HEADERS += \
    render.h

SOURCES += \
    main.cpp \
    render.cpp

QMAKE_CXXFLAGS_RELEASE -= -O
QMAKE_CXXFLAGS_RELEASE -= -O1
QMAKE_CXXFLAGS_RELEASE -= -O2

win32 { # For Windows
  QMAKE_CXXFLAGS += -openmp
  QMAKE_CXXFLAGS += -arch:AVX
  QMAKE_CXXFLAGS += -D "_CRT_SECURE_NO_WARNINGS"
  QMAKE_CXXFLAGS_RELEASE *= -O2
}

linux { # For Linux
  QMAKE_CXXFLAGS += -fopenmp
  QMAKE_LFLAGS += -fopenmp
  QMAKE_CXXFLAGS += -mavx
  QMAKE_CXXFLAGS_RELEASE *= -O3
}

【讨论】:

  • 嗯,这比原来的帖子好多少?此外,QT 变量不需要 core 和 gui。默认情况下包含它们!
  • 好吧,OP 说他的帖子不起作用。我想没有问题。但我试过你的例子。它对我不起作用。我必须添加到 GCC QMAKE_LFLAGS += -fopenmp 否则我会收到一堆链接器错误(error: undefined reference to omp_get_num_threads 等等)。
  • 这个答案的问题是你不能用它来区分MinGW和MSVC,例如......
  • @mozzbozz,好的,但是除非将-fopenmp 添加到 LFLAGS,否则接受的答案仍然不适用于 GCC。无论如何,我已经从 qmake 继续前进,现在使用 qtcreator 代替 cmake。
  • @Zboson:好吧,您将 fopenmp 添加到“linux”范围,有什么问题?但无论如何,两者的结合可能是在“现实世界”情况下所需要的。而且我有时也考虑切换到 cmake,因为 qmake 缺少一些功能......(并且文档有时很糟糕)但是这需要很多时间才能再次解决所有问题,所以它必须等到我'我在某些时候感到无聊;)
猜你喜欢
  • 2023-03-11
  • 2023-03-12
  • 1970-01-01
  • 2015-03-30
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 2012-03-31
相关资源
最近更新 更多