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
char、signed char、unsigned char之间的关系,以及不同架构机器上char的默认类型。
评论
0 评论