【发布时间】:2016-09-14 06:43:05
【问题描述】:
我正在开发一个使用 SIMD 指令集的 QT 小部件。我编译了 3 个版本:SSE3、AVX 和 AVX2(simdpp 允许通过单个#define 在它们之间切换)。
现在,我希望我的小部件根据最受支持的指令集在这些实现之间自动切换。 simdpp 提供的指南使用了一些 makefile 魔法:
CXXFLAGS=""
test: main.o test_sse2.o test_sse3.o test_sse4_1.o test_null.o
g++ $^ -o test
main.o: main.cc
g++ main.cc $(CXXFLAGS) -c -o main.o
test_null.o: test.cc
g++ test.cc -c $(CXXFLAGS) -DSIMDPP_EMIT_DISPATCHER \
-DSIMDPP_DISPATCH_ARCH1=SIMDPP_ARCH_X86_SSE2 \
-DSIMDPP_DISPATCH_ARCH2=SIMDPP_ARCH_X86_SSE3 \
-DSIMDPP_DISPATCH_ARCH3=SIMDPP_ARCH_X86_SSE4_1 -o test_null.o
test_sse2.o: test.cc
g++ test.cc -c $(CXXFLAGS) -DSIMDPP_ARCH_X86_SSE2 -msse2 -o test_sse2.o
test_sse3.o: test.cc
g++ test.cc -c $(CXXFLAGS) -DSIMDPP_ARCH_X86_SSE3 -msse3 -o test_sse3.o
test_sse4_1.o: test.cc
g++ test.cc -c $(CXXFLAGS) -DSIMDPP_ARCH_X86_SSE4_1 -msse4.1 -o test_sse4_1.o
这里是指南的链接:http://p12tic.github.io/libsimdpp/v2.0~rc2/libsimdpp/arch/dispatch.html
我不知道如何使用 qmake 实现这种行为。有什么想法吗?
首先想到的是创建一个包含已调度代码的共享库,并将其链接到项目。在这里,我又被困住了。应用程序是跨平台的,这意味着它必须同时使用 GCC 和 MSVC(准确地说是 vc120)编译,这迫使在 Windows 中使用 nmake,我确实尝试过,但这就像我整个程序员生涯中最糟糕的经历.
提前致谢,全世界的程序员!
【问题讨论】:
-
您不能使用 qmake 多次构建同一个文件。您需要找到解决方法(将 ifdef 代码拆分到多个文件等)