iceonsun / rsock

The best companion of kcptun
https://github.com/iceonsun/rsock/wiki/rsock%E7%AE%80%E4%BB%8B%E4%BB%A5%E5%8F%8A%E5%8E%9F%E7%90%86
245 stars 36 forks source link

server_rsock_Darwin for macOS Illegal instruction. #2

Closed david9991 closed 6 years ago

david9991 commented 6 years ago

server_rsock_Darwin 在我 14mid 的 MBP 运行没问题,但在 12later 的 Mac Mini 上发生 Illegal instruction 错误。 你编译的时候应该加 -march=x86-64 参数。这样就可以限定架构指令集,而不是本机最大优化。最大优化完其它老机器不一定能用了。

iceonsun commented 6 years ago

我手头只有14年的MBP,所以麻烦你试一下这个版本 https://github.com/iceonsun/rsock/releases/tag/v1.5.1

david9991 commented 6 years ago

v1.5.1 不好用,但我在我的 14MBP 上重编完在 12later 上能跑。奇怪。 顺手改了一个编译不过的问题。虽然不知道为啥 !data 还要判断 data <= 0?我本能地加个强转。XD

diff --git a/util/rhash.cpp b/util/rhash.cpp
index 12b4c2f..488662b 100644
--- a/util/rhash.cpp
+++ b/util/rhash.cpp
@@ -24,7 +24,7 @@ static bool hash_equal(const HashBufType &hashed_buf, const std::string &key, co
 static int8_t compute_hash(HashBufType &hash, const std::string &key, const char *data, int data_len);

 int8_t compute_hash(HashBufType &hash, const std::string &key, const char *data, int data_len) {
-    if (!data || data <= 0) {
+    if (!data || (size_t)data <= 0) {
         return -1;
     }
     assert(hash.size() <= MD5_LEN);
iceonsun commented 6 years ago

v1.5.1 不好用

不好用指的是速度变慢了还是仍然不能跑

但我在我的 14MBP 上重编完在 12later 上能跑

你重编用的是project中的Darwin,还是用的CMakeLists.txt

data 还要判断 data <= 0?

错了错了,应该是判断 data_len <= 0。

david9991 commented 6 years ago

不好用是指还是 Illegal instruction。 我是用 CMakeList.txt 重编的,mkdir build; cd build; cmake ..; make 这么编的,好使。

iceonsun commented 6 years ago

你mini的系统和pro一样吗,检查一下有没有这个库 /usr/lib/libc++.dylib

david9991 commented 6 years ago

我现在 mini 连接不上,不过这两个系统我都升级到了 high sierra 10.13.3 了,libc++.dylib 应该是苹果的标配吧,libstdc++ 反而需要另安。 Illegal instruction 这个问题我们之前也遇到过,基本就是加 march=amd64 或 x86-64 来解决,但那都是手写 Makefile 才需要加,CMake 我们没加倒也没出现问题。你能说明一下你发布的二进制的详细的编译方法吗?我用你的方法试试。

iceonsun commented 6 years ago

编译步骤:

cd path/to/rSock/
mkdir xbuild/build/Darwin_x86_64 && cd xbuild/build/Darwin_x86_64
 cmake -DCMAKE_TOOLCHAIN_FILE=../../cmake/Darwin_x86_64.toolchain.cmake ../../..

这个macos toolchain指定了用clang++(所以不用装libstdc++)。

在前一个版本已经取消了-O2优化。

我网上查了一下,很可能是你说的那个问题。昨天那个1.5.1已经在cmake中加了march=x86-64。你说也不行,我就先撤销了。我手上目前也只有一台14年的pro,所以不大方便测试更旧机子。

你要是不介意的话,麻烦你测试一下。直接在CMakeLists.txt 中(##release之前)添加一行 add_definitions(march=amd64) 或者 add_definitions(march=x86-64)

david9991 commented 6 years ago

我试试看能否重现这个问题。

david9991 commented 6 years ago

果然用你的方法 Illegal instruction…… 不加 toolchain.cmake 其实是用我本机的 libuv, libnet, libpcap 的动态库动态编译。而使用你的 toolchain.cmake 用的你的 xbuild/lib 下的静态库编译,所以判断问题应该出在你的静态库里。如果你的静态库也是从 brew 里取的,那你是否 export HOMEBREW_ARCH=x86_64 再安装的这三个库呢?因为 Homebrew 在编译安装的时候,也需要指定 -march,才能架构兼容。

我刚刚用我的 home-brew 的这三个库替换掉了你的,在 12later 上好用了。

iceonsun commented 6 years ago

如果你的静态库也是从 brew 里取的

对的。是直接从brew里面取出来的。 我用了你的方法,重新编译了一下, 麻烦你试试看。 https://github.com/iceonsun/rsock/releases/tag/v1.6.0

david9991 commented 6 years ago

这回好使了。