qmake:处理gcc和msvc的选项

10

我想制作一个可以在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 并将新的与我的应用程序捆绑在一起,但这不是非常便携。


什么问题?你说“它不幸地不起作用”是什么意思? - Bill
你尝试过像文档中描述的那样使用 win32!win32 这样的作用域吗?http://qt-project.org/doc/qt-4.8/qmake-advanced-usage.html - Retired Ninja
如果我将之前放置在项目文件中的代码添加进去,我仍然会得到:cl -O3 -march=native -fopenmp -D_GLIBCXX_PARALLEL,而我想要的是 cl /O2 /openmp /arch:AVX - Jean-Michaël Celerier
我不想使用基于操作系统的作用域,因为MinGW可能在Windows上使用。 - Jean-Michaël Celerier
1
@Jean-MichaëlCelerier 奇怪。我刚刚创建了一个简单的.pro文件,其中包含您问题中的2行,并添加了另一行:message($${QMAKE_CXXFLAGS_RELEASE})。当我运行qmake时,我得到了这个:Project MESSAGE: -O2 -MD /O2 /openmp /arch:AVX,这很好,因为我的环境是Win7 + MSVC2010。那你的环境是什么? - Bill
1
嗯,有点奇怪。我想我应该再运行一到两次qmake以确保,因为现在它可以运行了。谢谢! - Jean-Michaël Celerier
2个回答

13

具体来说,根据您的描述,您应该使用这个:

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

1
有没有编译器定义的列表?比如说,如果有一天我想使用clang?(即使我认为选项与gcc兼容,不是吗?) - Jean-Michaël Celerier
@Jean-MichaëlCelerier:是的,你说得对:至少目前为止,Clang试图具有与gcc兼容的选项,因此只要不使用任何奇怪的选项,就不应该会出现问题... ;) - mozzbozz
根据你的第一个问题:我已经寻找qmake编译器范围列表几分钟了(我也需要它),但是找不到任何东西:/ 但是通过试错,我发现MinGW只是“mingw”(所以与“gcc”和“msvc”相同->易于猜测); 因此,对于clang,我非常有信心它是“clang”;)编辑:这可能有所帮助:https://dev59.com/Sm3Xa4cB1Zd3GeqPhKqg - mozzbozz
@mozzbozz:离题了,但你可以在mkspecs中查找QMAKE_COMPILER变量。顺便说一句,“mingw”似乎是一个平台,而不是编译器,但没错,它可以工作。在这种情况下,关键字是QMAKE_PLATFORM。 - László Papp

0

这是我一直在使用的项目文件。它适用于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。它们已经默认包含了! - László Papp
首先,OP说他的帖子没有起作用。我猜没有问题。但是我尝试了你的例子。它对我不起作用。我必须在GCC中添加QMAKE_LFLAGS += -fopenmp,否则我会得到一堆链接器错误(例如“error: undefined reference to omp_get_num_threads”等)。 - Z boson
这个答案的问题在于你不能用它来区分MinGW和MSVC,例如... - mozzbozz
@mozzbozz,好的,但是除非将-fopenmp添加到LFLAGS中,否则接受的答案仍无法在GCC上工作。无论如何,我已经放弃了qmake,现在改用qtcreator和cmake。 - Z boson
@Zboson:把fopenmp添加到"linux"作用域中,有什么问题吗?但无论如何,在"现实世界"的情况下,可能需要两者结合起来使用。我也考虑过有时切换到cmake,因为qmake缺少一些功能...(而且文档有时很糟糕)。然而,这需要花费很多时间再次弄清楚所有内容,所以它将等到我某个闲暇时再处理;) - mozzbozz
@mozzbozz,gcc需要使用“-fopenmp”进行编译和链接。 - Z boson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接