关于gcc问题解决
最近gcc编译出来的so库之类的使用总有问题,收集资料后简单整理下解决方法:
- 首先使用ldd 或者ldd -r XXX 查看文件所连接的so库有没有问题,目前我看到的经常是出现(undefined symbol: lua_getfield)在c中,动态库中的symbol就是函数名,所以一看到就知道是lua库没有链接导致函数找不到加上-llua即可以解决。 而c 由于允许重载,就出现同一个函数名可能对应多个实际的函数问题,于是就会有name mangling ,而且这个mangling完全没有任何规范可循,由编译器自定。解决方法:简而言之,就是用exturn “C”
- 对于经常加载一些so时,提示undified symbol,在gcc编译时,需要把链接动态库放最后面
- 对于编译时候找不到的so的问题,之前已经提过了,主要原因就是库文件没有导入ld(dynamic loader)检索目录中。
- 解决方式: 1。确认库文件是否存在,比如-l123, 在/usr/lib, /usr/local/lib,或者其他自定义的lib下有无lib123.so, 如果只是存在lib123.so.1,那么可以通过ln -sv lib123.so.1 lib123.so,建立一个连接重建lib123.so. 2。检查/etc/ld.so.conf中的库文件路径是否正确,如果库文件不是使用系统路径,/usr/lib, /usr/local/lib, 那么必须在文件中加入. 3。ldconfig 重建ld.so.cache文件,ld的库文件检索目录存放文件。尤其刚刚编译安装的软件,必须运行ldconfig,才能将新安装的库文件导入ld.so.cache. 更多有关具体linux /etc/ld.so.conf 的相关信息参考动态装入器 关于gcc编译链接可参考 GCC/LD编译链接潜规则