构建 sqlite3mc 合并失败并显示“_mm_aesimc_si128”:目标特定选项不匹配 - 即使使用 -march=native

Building sqlite3mc amalgamation fails with ‘_mm_aesimc_si128’: target specific option mismatch - Even with -march=native

我正在尝试构建这个项目:https://github.com/utelle/SQLite3MultipleCiphers
具体来说,合并文件位于:https://github.com/utelle/SQLite3MultipleCiphers/releases/tag/v1.2.5

我从 _mm_aesimc_si128 函数中得到这个错误:

/usr/lib/gcc/x86_64-linux-gnu/9/include/wmmintrin.
h:77: error: inlining failed in call to always_inline ‘_mm_aesimc_si128’: target specific option mismatch
In file included from ../sqlite3mc/sqlite3mc_amalgamation.c:250494:
../sqlite3mc/sqlite3mc_amalgamation.c: In function ‘aesGenKeyDecrypt’:
/usr/lib/gcc/x86_64-linux-gnu/9/include/wmmintrin.h:77:1: error: inlining failed in call to always_inline ‘_mm_aesimc_si128’: target specific option mismatch
   77 | _mm_aesimc_si128 (__m128i __X)
      | ^~~~~~~~~~~~~~~~
../sqlite3mc/sqlite3mc_amalgamation.c:250589:26: note: called from here

我从其他问题中了解到,我的 CPU 需要支持这些内部函数,并且我需要传入编译器标志以启用它们。我 认为 为此我需要 AES 和 SSE4.2,因为 Github 代码中的 Makefile.am 对于 x86 具有 -msse4.2 -maes

我正在使用 QtCreator 和 qmake,因为我正试图将其集成到现有的 Qt 项目中,但我现在只是想让它与新项目一起工作。

这是我的 .pro 文件,我正在传递 -march=native 标志(我也尝试了 -msse4.2 -maes,结果相同):

TEMPLATE = app
CONFIG += console c++17
CONFIG -= app_bundle qt debug_and_release

SOURCES += \
        main.cpp \
        sqlite3mc_amalgamation.c

HEADERS += \
    sqlite3.h \
    sqlite3ext.h \
    sqlite3mc_amalgamation.h

QMAKE_CXXFLAGS += -march=native

检查我的体系结构的启用标志,并搜索 aes 和 sse 给我:

g++ -Q --help=target -march=native | egrep "(msse)|(maes)"

-maes                               [enabled]
-msse                               [enabled]
-msse2                              [enabled]
-msse2avx                           [disabled]
-msse3                              [enabled]
-msse4                              [enabled]
-msse4.1                            [enabled]
-msse4.2                            [enabled]
-msse4a                             [disabled]
-msse5                              
-msseregparm                        [disabled]

正在检查我的 CPU 的可用扩展名并搜索 sse 和 aes:

lscpu | egrep "(sse)|(aes)"
Flags: sse sse2 ssse3 sse4_1 sse4_2 aes <many other flags>

所以 -march=native 启用了 SSE4.2 和 AES,我的 CPU 也支持 SSE4.2 和 AES,但我仍然遇到错误。

我该怎么做才能克服这个错误(并希望构建整个东西)?

由于合并文件是 C 文件,因此它应该是:

QMAKE_CFLAGS += -march=native

没有

QMAKE_CXXFLAGS += -march=native

此外,sqlite3mc 使用 pthread 和 ldl,因此必须链接这些库:

LIBS += -pthread -ldl

进行这些更改后,构建成功。