gcc交叉编译时发生这种错误

/.. .../voice_demo: hidden symbol `pthread_atfork' in /opt/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux/bin/../aarch64-linux-gnu/libc/usr/lib/aarch64-linux-gnu/libpthread_nonshared.a(pthread_atfork.oS) is referenced by DSO

调用关系如下:

A->B.so->多线程函数库

A依赖B的动态库文件。B动态库又依赖于多线程函数库

原因

实际上,pthread_atfork这个函数并不在libpthread.so.0库里面。 是在链接的时候直接把一个.a链接到库里面的

B.so在链接的时候,使用-lpthread引入多线程库,而-lpthread并不会把包含pthread_atfork

的静态库链进来。

解决方法

B.so在编译的时候 使用-pthread引入多线程库,而不是-lpthread

-lpthread和pthread的区别

例如下面的代码,使用了多线程库。

#include <sys/types.h>
#include <pthread.h>
#include <sys/wait.h> pid_t self_pid; /* pid of current process */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void fork_prepare(void)
{
pthread_mutex_lock(&mutex);
} void fork_parent(void)
{
pthread_mutex_unlock(&mutex);
} void fork_child(void)
{
self_pid = getpid();
pthread_mutex_unlock(&mutex);
} void *thread_routine(void *arg)
{
pid_t child_pid; child_pid = fork();
if(child_pid == (pid_t)-1)
return NULL; pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
printf("After fork: %d (%d)\n", child_pid, self_pid);
if(child_pid != 0){ // parent process
if ((pid_t)-1 == waitpid(child_pid, (int*)0, 0))
return NULL;
}
return NULL;
} int main(int argc, char *argv[])
{
pthread_t fork_thread;
int atfork_flag = 1; if(argc > 1)
atfork_flag = atoi (argv[1]);
if(atfork_flag){
pthread_atfork(fork_prepare, fork_parent, fork_child);
}
self_pid = getpid();
pthread_mutex_lock(&mutex); pthread_create(&fork_thread, NULL, thread_routine, NULL);
sleep(5);
pthread_mutex_unlock (&mutex);
pthread_join(fork_thread, NULL); return 0;
}

分别采用两种方式编译成动态库

gcc -shared -fPIC  -Wall -lpthread -o atfork.so main.c
gcc -shared -fPIC -Wall -pthread -o atfork.so main.c

采用-lpthread生成的so大小为13008

采用-pthread生成的so大小为16816,说明链接了一块东西。。

附:如果直接用-lpthread将上段代码生成可执行程序,是会报错的,因为找不到符号。

而-pthread是不会有这种问题的。

为什么会有这种区别呢。

gcc -v -shared -fPIC  -Wall -lpthread -o atfork.so main.c
gcc -v -shared -fPIC -Wall -pthread -o atfork.so main.c

分别打印诊断日志。

进行比较发现。

gcc -v -shared -fPIC  -Wall -pthread -o atfork.so main.c
输出
/usr/lib/gcc/x86_64-linux-gnu/5/cc1 -quiet -v -imultiarch x86_64-linux-gnu -D_REENTRANT main.c -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase main -Wall -version -fPIC -fstack-protector-strong -Wformat-security -o /tmp/cciFOaoT.s gcc -v -shared -fPIC -Wall -lpthread -o atfork.so main.c
输出
/usr/lib/gcc/x86_64-linux-gnu/5/cc1 -quiet -v -imultiarch x86_64-linux-gnu main.c -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase main -Wall -version -fPIC -fstack-protector-strong -Wformat-security -o /tmp/ccZTeFNI.s

第一个多了-D_REENTRANT, 这个宏是线程安全的意思。

转载的时候,请注明出处哦http://www.cnblogs.com/stonehat/

hidden symbol `pthread_atfork'的更多相关文章

  1. unsupported dynamic reloc R_ARM_REL32 AND hidden symbol '__dso_handle' is not defined

    项目里编译codec src\makefiles\android\codec\Makefileline 25 原本用 4.6 不会报错-L/data/android/android-ndk/sourc ...

  2. hidden symbol ... is referenced by DSO

    在Linux上编译Qt的时候configure出来的Makefile传递给g++的参数visiblility=hidden,然后就会调用Qt库所使用的第三方库libpng库源代码函数声明添加上__at ...

  3. Ubuntu上安装ns2-2.34

    Ubuntu上安装ns2-2.34 步骤1 下载ns-allinone-2.34 $ tar zxf ns-allinone-2.34.tar.gz 步骤2 sudo apt-get install ...

  4. OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)

    OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...

  5. OpenCV4Android

    前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反应依然配不好OpenCV4Android,不能得心应手的在Android上使用OpenCV,大量的精力都浪费在摸索配置上.尤其是 ...

  6. 移植 Qt 至 tiny210 详细过程

    实验所需资源: tiny210(cortex-a8) QT 版本:5.6.2 PC 环境:UBUNTU tslib:tslib-1.4 交叉工具链:4.5.1 开发板已装载好 Linux 编译 tsl ...

  7. 深入浅出 SVG

    前言 据悉,8月18号将在广州举办中国第一届React开发者大会.今日早读文章由@Starrier翻译分享. 正文从这开始- SVG 是优秀且令人难以置信的强大图像格式.本教程通过简单地解释所有需要了 ...

  8. 『MXNet』第六弹_Gluon性能提升

    一.符号式编程 1.命令式编程和符号式编程 命令式: def add(a, b): return a + b def fancy_func(a, b, c, d): e = add(a, b) f = ...

  9. base标签对svg的影响

    页面地址:http://127.0.0.1:8080/fullLink_node.html?project_id=2 base:<base href="http://127.0.0.1 ...

随机推荐

  1. qt 字符数组如何转换字符串?

    char 字符数组如何转换成 QString? char source{1024} = {0}; QString des = QString::fromLocal8Bit(source);

  2. css线性渐变兼容

    css线性渐变兼容 background: linear-gradient(top, rgba(54, 77, 127, 0.8), rgba(54, 77, 127, 0.8)); backgrou ...

  3. C语言老司机学Python (四)

    字符串格式化: 可以使用类似c语言中sprintf函数的方法进行格式化,但是函数名称是print() 如:print('常量 PI 的值近似为:%5.3f.'  %  var_PI) 注意var_PI ...

  4. XAF_GS_02_创建第一个XAF项目

    上一节我们讲解了如何安装XAF环境,这次我们要开始创建一个自己的XAF项目. Setp 1 第一步打开你的Visual Studio,新建项目,如下图所示,选择DevExpress XAF,选择好你的 ...

  5. supervessel-免费云镜像︱GPU加速的Caffe深度学习开发环境

    开发环境介绍 在SuperVessel云上,我们为大家免费提供当前火热的caffe深度学习开发环境.SuperVessel的Caffe有如下优点: 1) 免去了繁琐的Caffe环境的安装配置,即申请即 ...

  6. linux驱动---字符设备的注册register_chrdev说起

    首先我们在注册函数里面调用了register_chrdev(MEM_MAJOR,"mem",&memory_fops),向内核注册了一个字符设备. 第一个参数是主设备号,0 ...

  7. Java中获取文件路径

    Java中获取文件路径 1.实例说明 (1)得到 ClassPath的绝对URI路径 Thread.currentThread().getContextClassLoader().getResourc ...

  8. strcmp函数实现

    /* 功能:比较字符串s1和s2大小. 一般形式:int strcmp(字符串1,字符串2) 说明: 当s1<s2时,返回-1 当s1=s2时,返回 0 当s1>s2时,返回 1 即两个字 ...

  9. Flex报错之二

    1.错误描述 SecurityError: Error #2148: SWF 文件 file:///D:/Adobe Flash Builder 4 Installer/demo1/bin-debug ...

  10. 对ajax回调函数的研究

    1.1开发中遇到的问题 最近开发中我和同事都碰到这样的问题,我们使用jQuery的ajax方法做服务端的校验,在success方法里将验证结果存储到一个js的公共变量或者是页面里的隐藏域,接下来的代码 ...