zoukankan      html  css  js  c++  java
  • gcc编译时对’xxxx’未定义的引用问题

    在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没有问题,但是编译(这一步应该是链接)为可执行文件的时候会出现找不到’xxx’的定义的情况。

    本文由乌合之众 lym瞎编,欢迎转载blog.cnblogs.net/oloroso
    本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

    例如:

    g++ -o spider   -rdynamic -lpthread -levent -lcrypt -ldl bloomfilter.o confparser.o crc32.o dso.o hashs.o md5.o qstring.o sha1.o socket.o spider.o threads.o url.o
    ...
    
    dso.o:在函数‘dso_load(char const*, char const*)’中:
    dso.cpp:(.text+0x3c):对‘dlopen’未定义的引用
    dso.cpp:(.text+0x4c):对‘dlsym’未定义的引用
    dso.cpp:(.text+0xb5):对‘dlerror’未定义的引用
    dso.cpp:(.text+0x13e):对‘dlclose’未定义的引用
    

    原因

    出现这种情况的原因,主要是C/C++编译为obj文件的时候并不需要函数的具体实现,只要有函数的原型即可。但是在链接为可执行文件的时候就必须要具体的实现了。如果错误是未声明的引用,那就是找不到函数的原型,解决办法这里就不细致说了,通常是相关的头文件未包含。

    解决办法

    指定原因就好办了,既然知道是缺少了函数的具体实现,那么就给它这个函数的实现就好了。比如上面的例子,是因为缺失了dlopendlsymdlerrordlclose这些函数的实现,这几个函数是用于加载动态链接库的,编译的时候需要添加-ldl来使用dl库(这是静态库,在系统目录下/usr/lib/i386-linux-gnu/libdl.a/usr/lib/x86_64-linux-gnu/libdl.a)。

    但是看上面编译的时候是有添加-ldl选项的,那么为什么不行呢?

    gcc 依赖顺序问题

    这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。

    gcc编译的时候,如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。

    例如:在main.c中使用了pthread库相关函数,那么编译的时候必须是main.c在前,-lpthread在后。gcc main.c -lpthread -o a.out

    上面出现问题的原因就是引入库的顺序在前面了,将其放置在后面即可了。

    g++ -o spider  bloomfilter.o confparser.o crc32.o dso.o hashs.o md5.o qstring.o sha1.o socket.o spider.o threads.o url.o    -rdynamic -lpthread -levent -lcrypt -ldl
  • 相关阅读:
    反向代理实例
    nginx常用命令和配置
    nginx的安装
    Can Live View boot up images acquired from 64bit OS evidence?
    What is the behavior of lnk files?
    EnCase v7 search hits in compound files?
    How to search compound files
    iOS 8.3 JB ready
    Sunglasses
    现代福尔摩斯
  • 原文地址:https://www.cnblogs.com/qiumingcheng/p/8366159.html
Copyright © 2011-2022 走看看