makefile文件编写时常见错误总结

在Linux上编译C/C++时,makefile中需要经常添加一些编译选项。比如

-pthread    #为了使C++项目可以使用多线程库
-ldl        #
-stdc++     #编译时调用C++标准库
-std=gnu99  #使用C99标准

这里重点讲一下 -ldl 选项。
问题描述:

undefined reference to `dlsym' undefined reference to `dlerror'
undefined reference to `dlopen' undefined reference to `dlclose'

编译时提示出现一系列以dl为前缀的一些变量或函数未被定义,离奇的是我并没有使用过这些东西,并且不知道它们是在哪被引用的。后来问了问凯旋,才知道是因为编译选项少加了参数 -ldl。加入该参数后,在编译时才会包含dl库,从而解决报错。
由此我通过网上查询资料,整理了下常见的gcc编译连接错误及解决办法(针对x86/x86_64的Linux环境):

  • 没有指定链接参数-lz

错误提示:

/usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_uncompress': /home/software/mysql-5.5.24/mysys/my_compress.c:122: undefined reference to `uncompress'
/usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_compress_alloc': /home/software/mysql-5.5.24/mysys/my_compress.c:71: undefined reference to `compress'
  • 没有指定编译链接参数-pthread(注意不仅仅是-lpthraed)

错误提示:

/usr/local/mysql/lib/mysql/libmysqlclient.a(charset.c.o): In function `get_charset_name': /home/zhangsan/mysql-5.5.24/mysys/charset.c:533: undefined reference to `pthread_once'
  • 没有指定链接参数-lrt

错误提示:

/usr/local/thirdparty/curl/lib/libcurl.a(libcurl_la-timeval.o): In function `curlx_tvnow': timeval.c:(.text+0xe9): undefined reference to `clock_gettime'
  • 没有指定链接参数-ldl

    错误提示:

/usr/local/thirdparty/openssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': dso_dlfcn.c:(.text+0x4c): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x62): undefined reference to `dlsym' dso_dlfcn.c:(.text+0x6c): undefined reference to `dlclose'
  • 需要指定链接参数-static,它的存在,要求链接的必须是静态库,而不能是共享库。

    错误提示:

ld: attempted static link of dynamic object

如果是以-L加-l方式指定,则目录下必须有.a文件存在,否则会报-l的库文件找不到:

ld: cannot find -lACE
  • 没有指定-fPIC(-fPIC即是编译参数,也是链接参数)

    错误提示:

relocation R_x86_64_32S against `vtable for CMyClass` can not be used when making a shared object
  • gcc编译时需要定义宏__STDC_FORMAT_MACROS,并且必须包含头文件inttypes.h

错误提示:

error: expected `)' before 'PRIu64'
  • 编译一个共享库时,该共享库依赖的一静态库编译时没有加“-fPIC”参数,解决方法为带“-fPIC”重新编译被依赖的静态库

错误提示:

relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

charsigned charunsigned char之间的关系,以及不同架构机器上char的默认类型。


标题:makefile文件编写时常见错误总结
作者:staymeloo7
联系方式:staycoolsun@gmail.com

    评论
    0 评论
avatar

取消