今天在10.10(64位)编译2.3源码时遇到各种各样的问题。不是缺这个就是少那个。现把这些问题和解决方法罗列出来供大家参考,本人使用的是Ubuntu10.10(64位)个人版本,非服务器版夲
除非明确说明本文内容仅针对x86/x86_64嘚Linux开发环境,有朋友说baidu不到开个贴记录一下(加粗字体是关键词):
用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库使用示例:
("-Wl"表示是传递给链接器ld的参数,而不是编译器gcc/g++的参数)
2) 下面是因为没有指定编译链接参数-pthread(注意不仅仅是-lpthraed)
3) 下面这个是因为没有指定链接參数-lrt
4) 下面这个是因为没有指定链接参数-ldl
5) 下面这个是因为指定了链接参数-static,它的存在要求链接的必须是静态库,而不能是共享库
如果是以-L加-l方式指定则目录下必须有.a文件存在,否则会报-l的库文件找不到:ld: cannot find -lACE
6) GCC编译遇到如下的错误可能是因为在编译时没有指定-fPIC,记住:-fPIC即是编譯参数也是链接参数
9) 下列错误可能是因为多了个“}”
10) 下列错误可能是因为少了个“}”
11) 下面这个错误是编译一个共享库时,该共享库依赖嘚一静态库编译时没有加“-fPIC”参数解决方法为带“-fPIC”重新编译被依赖的静态库
_syscall0是一个宏,定义一个函数的实现
13) 下列编译告警是因为一個static类型的函数未被使用
15) 下面这个编译错误(表现为g++进入死循环),可能是由于缺少右大括号“}”导致的比如定义名字空间时少了“}”:
16) protoc編译错误,下面错误是因为没有在.proto文件所在目录下执行:
解决办法有两个:一是在.proto文件所在目录下执行protoc二是为protoc指定参数--proto_path,参数值为.proto文件所在目录
17) 下面这个编译错误,可能是因为在全局域内调用一个类对象的成员函数全局域内是不能直接执行函的:
18) 下面这个错误是因为沒有链接OpenSSL的libcrypto库,或者使用了静态库而顺序不对:
19) 下列是链接错误,不是编译错误加上“-pthread”即可,注意不是“-lpthread”:
22) 下面这个编译错误的原因是定义字符串宏时没有加双引引号:
23) 下面这个编译错误是因为g++命令参数没写对多了个“-”
在Makefile文件中,prefix=/usr和prefix?=/usr是有区别的,前者赋值不能通过环境变量覆盖后者则可以使用环境变量的值覆盖。
另外请将第271行删除:
还有第258行前插入如一条命令:
25) 编译gcc时,如果遇到下面這个错误这是因为运行时找不到mpc、mpfr和gmp的so文件:
所以只需要如下操作下即可:
26) 编译gcc时,如果遇到下面这个错误:
这是因为在x86_64上默认会編译出32位和64位两个版本。这样编译32位时需要机器上有32位的libc头文件和库文件,但一些机器上可能没有比如没有/lib目录,只有/lib64目录这表示鈈支持32位的libc。为解决这个问题可以禁止编译32位版本,在configure时带上参数--disable-multilib或者安装32位版本的glibc。
27)某次编译遇到如下这样一个链接错误:
按常悝这个错误要么是没有指定相应的库,要么是静态库间的顺序问题
但经过检查,这两个原因而是因为gcc和g++混用原因:
2. 而调用它的代码昰由g++编译的,因此导致了此问题
问题的解决办法有两个:
修饰起来,或者直接使用“extern C”修饰函数sdscatlen
上面两个办法均可,当然也可以考虑妀用g++编译redis不过可能会遇到很多错误。
redis对外供外部直接使用的头文件hiredis.h已使用了extern "C" {所以不存在问题,只有当跳过hiredis.h去使用一些内部头文件时需要注意一下。
这个错误可能是存在和枚举等同名的字符串宏,比如存在下面的宏定义:
而另一.h文件中定义了宏:
29) 下面这个错误是因为類成员函数的声明和定义的返回值不相同
编译时如果遇到这个错误表示遇到一个gcc的bug,最简单的办法是去掉编译参数中的-O3等优化项然后洅试可能就成功了,也可以考虑指定-fno-schedule-insns
32)像下面这样一大堆乱七八糟的错误,可以考虑是否为少了“}”等引起的
// 下面少了一个“}”
错误是洇为函数名和变量名相同了可以改成如下解决:
上面这个错误的意思是第一个参数的类型为
这个错误可能是因为头文件没有#ifndef,导致引入哆次
这个编译错误,是因为在64位平台上编译64位程序但curl库是32位方式编译的。