Ubuntu24.04 交叉编译libuv库(已编译好的) 之undefined reference to `pthread_getname_np‘解决
一、问题:
/opt/code/midea_gw/toolchain/cur_toolchain/toolchain-aarch64_generic_gcc-8.4.0_musl/bin/../lib/gcc/aarch64-openwrt-linux-musl/8.4.0/../../../../aarch64-openwrt-linux-musl/bin/ld: ./libuv/lib//libuv.so: undefined reference to `pthread_getname_np'
collect2: error: ld returned 1 exit status
二、查看函数定义:
在Ubuntu24.04 终端中执行:
man pthread_getname_np
可以看到其只有在特定版本 glibc 2.12
三、解决办法:
打开libuv1.x文件夹下的 src/unix/thread.c 文件,将uv__thread_getname 函数
int uv__thread_getname(uv_thread_t* tid, char* name, size_t size) {int r;char thread_name[UV_PTHREAD_MAX_NAMELEN_NP];r = pthread_getname_np(*tid, thread_name, sizeof(thread_name));if (r != 0)return UV__ERR(r);strncpy(name, thread_name, size - 1);name[size - 1] = '\0';return 0;
}
修改如下:
int uv__thread_getname(uv_thread_t* tid, char* name, size_t size) {int r;char thread_name[UV_PTHREAD_MAX_NAMELEN_NP];
#if ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 12)))r = pthread_getname_np(*tid, thread_name, sizeof(thread_name));
#endifif (r != 0)return UV__ERR(r);strncpy(name, thread_name, size - 1);name[size - 1] = '\0';return 0;
}
其作用是该函数无效,允许其编译过。