WizTeam / WizQTClient

为知笔记跨平台客户端
Other
2.63k stars 810 forks source link

fedora编译cryptopp失败 #307

Open 1dot75cm opened 9 years ago

1dot75cm commented 9 years ago

环境:fedora 21 x86_64, gcc 4.9.2 版本:https://github.com/WizTeam/WizQTClient/commit/ec94b93c1f1cfae8a879b0e2552ef0ffa486754d , https://github.com/WizTeam/WizQTClient/commit/2e51f137025f8e809f9c5d89b554d013a79bb705 编译命令:cmake -DWIZNOTE_USE_QT5=ON -DCMAKE_BUILD_TYPE=Release && make -j4 错误信息: In file included from WizQTClient/lib/cryptopp/whrlpool.cpp:69:0: WizQTClient/lib/cryptopp/cpu.h: 在函数‘m128i _mm_shuffle_epi8(m128i, m128i)’中: WizQTClient/lib/cryptopp/cpu.h:24:1: 错误:‘__m128i _mm_shuffle_epi8(m128i, m128i)’ 重定义 _mm_shuffle_epi8 (m128i a, m128i b) ^ In file included from /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/x86intrin.h:37:0, from /usr/include/c++/4.9.2/x86_64-redhat-linux/bits/opt_random.h:33, from /usr/include/c++/4.9.2/random:50, from /usr/include/c++/4.9.2/bits/stl_algo.h:66, from /usr/include/c++/4.9.2/algorithm:62, from /WizQTClient/lib/cryptopp/stdcpp.h:18, from /WizQTClient/lib/cryptopp/cryptlib.h:83, from /WizQTClient/lib/cryptopp/iterhash.h:4, from /WizQTClient/lib/cryptopp/whrlpool.h:5, from /WizQTClient/lib/cryptopp/whrlpool.cpp:67: /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/tmmintrin.h:136:1: 附注:‘m128i _mm_shuffle_epi8(m128i, m128i)’已在此定义过 _mm_shuffle_epi8 (m128i X, m128i Y) ^ In file included from /WizQTClient/lib/cryptopp/whrlpool.cpp:69:0: /WizQTClient/lib/cryptopp/cpu.h: 在函数‘int _mm_extract_epi32(m128i, int)’中: /WizQTClient/lib/cryptopp/cpu.h:34:1: 错误:‘int _mm_extract_epi32(__m128i, int)’ 重定义 _mm_extract_epi32 (m128i a, const int i) ^ In file included from /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/x86intrin.h:41:0, from /usr/include/c++/4.9.2/x86_64-redhat-linux/bits/opt_random.h:33, from /usr/include/c++/4.9.2/random:50, from /usr/include/c++/4.9.2/bits/stl_algo.h:66, from /usr/include/c++/4.9.2/algorithm:62, from /WizQTClient/lib/cryptopp/stdcpp.h:18, from /WizQTClient/lib/cryptopp/cryptlib.h:83, from /WizQTClient/lib/cryptopp/iterhash.h:4, from /WizQTClient/lib/cryptopp/whrlpool.h:5, from /WizQTClient/lib/cryptopp/whrlpool.cpp:67: /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/smmintrin.h:447:1: 附注:‘int _mm_extract_epi32(__m128i, int)’已在此定义过 _mm_extract_epi32 (m128i X, const int __N) ^

尝试修改WizQTClient/lib/cryptopp/cpu.h 去除重定义的部分,报以下错误: /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/wmmintrin.h: 在函数‘m128i CryptoPP::CLMUL_Reduce(m128i, m128i, m128i, const m128i&)’中: /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/wmmintrin.h:116:1: 错误:inlining failed in call to always_inline ‘__m128i _mm_clmulepi64_si128(m128i, m128i, int)’: target specific option mismatch _mm_clmulepi64_si128 (m128i X, m128i Y, const int __I) ^ WizQTClient/lib/cryptopp/gcm.cpp:107:58: 错误:从此处调用 c1 = _mm_xor_si128(c1, _mm_clmulepi64_si128(c0, r, 0x10)); ^ In file included from /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/x86intrin.h:43:0, ... from /WizQTClient/lib/cryptopp/gcm.cpp:10: /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/wmmintrin.h:116:1: 错误:inlining failed in call to always_inline ‘m128i _mm_clmulepi64_si128(m128i, m128i, int)’: target specific option mismatch _mm_clmulepi64_si128 (m128i X, m128i Y, const int __I) ^ /home/mosquito/rpmbuild/BUILD/WizQTClient/lib/cryptopp/gcm.cpp:111:37: 错误:从此处调用 c0 = _mm_clmulepi64_si128(c0, r, 0); ^

coderlxn commented 9 years ago

cryptopp模块没有做过改动,和编译相关的改动是增加了对于C++11的支持,在Ubuntu上可以编译通过。稍后我会在Fedora上编译测试一下,其他系统上能不能正常编译?

1dot75cm commented 9 years ago

centos 7 暂未测试,一会测试下。 我看ppa上的编译日志buildlog_ubuntu-precise-amd64.wiznote_2.1.17_BUILDING.txt.gz,gcc 用的是 gcc-4.6_4.6.3-1ubuntu5 会有影响么?

coderlxn commented 9 years ago

cryptopp这个类库在使用gcc4.9编译的时候会出现错误,暂时请使用低版本的gcc进行编译。

1dot75cm commented 9 years ago

临时解决此问题,对于 gcc 大于 4.9.0 的发行版,关闭 cryptopp 指令集优化即可。在网上查询 option mismatch 这种现象好像与编译器行为有关,应该可以通过添加某些编译选项进行改变,以兼容旧 ABI 环境下编写的代码。

环境:fedora 22 x86_64, gcc 5.1.1 补丁:# sed -i '1a#define CRYPTOPP_DISABLE_SSE2' lib/cryptopp/config.h 编译结果:https://copr.fedoraproject.org/coprs/mosquito/myrepo/build/89996/

da-liii commented 9 years ago

我在debian上编译也失败了,所以我用的是debian源里面的crypto++。 只要改一下CMakeLists.txt就可以了,见https://github.com/sadhen/WizQTClient/commit/393481f270a283d5d6852e4aec6c7f904f7a6ea2

不知道为知笔记有没有对这些库做过什么修改,我直接用debian源里面的库应该没有问题吧?

1dot75cm commented 9 years ago

不知道为知笔记有没有对这些库做过什么修改 .....

WizLxn 说没做什么修改;动态链接程序肯定小了,功能正常么?

da-liii commented 9 years ago

没有修改的话,应该不会有什么异常吧。

反正我一直用着还蛮正常的。我是基本上能用动态链接就用动态链接。

1dot75cm commented 9 years ago

@sadhen

2.2.2 动态链接 quazip,运行会造成段错误,静链一切安好。

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffcca71700 (LWP 17034)]
0x00007ffff7bc7f7a in QuaZip::QuaZip(QString const&) () from /lib64/libquazip.so.1
scinart commented 8 years ago

使用最新的crypto++(当前是5.6.3)可以成功编译(Ubuntu, gcc-4.9.2),既然没有修改,建议把crypto++升级到新版本。

另外既然crypto++也是在Github托管的,能否尝试使用git-submodule来管理

369 也是这个问题。