• g++编译时遇到问题undefined reference to


    文件目录结构体为: src 和include 分别用来存放.cpp文件和 .hpp文件

    其中:src文件夹下有需要的文件 simulator_client.cpp crc32.cpp ; include文件夹下有对应的头文件 simulator_client.hpp、crc32.h及使用的头文件cJSON.h

    使用命令编译时遇到如下问题:

    g++ simulator_client.cpp  -o simulator_client -lm -I../include
    /tmp/ccZ5rfZQ.o: In function `packet_data(unsigned char, unsigned char, unsigned short, char*, unsigned int)':
    simulator_client.cpp:(.text+0x228): undefined reference to `crc32'
    simulator_client.cpp:(.text+0x27e): undefined reference to `crc32'
    /tmp/ccZ5rfZQ.o: In function `create_package_json_info(package*, int)':
    simulator_client.cpp:(.text+0x4e9): undefined reference to `cJSON_CreateObject'
    simulator_client.cpp:(.text+0x512): undefined reference to `cJSON_CreateString'
    ........
    collect2: error: ld returned 1 exit status

    原因: 主要是C/C++编译为obj文件的时候并不需要函数的具体实现,只要有函数的原型即可。但是在链接为可执行文件的时候就必须要具体的实现了。

    如果错误是未声明的引用,那就是找不到函数的原型,解决办法这里就不细致说了,通常是相关的头文件未包含。

    使用命令  g++ simulator_client.cpp crc32.cpp -o simulator_client -lm -I../include 后

    undefined reference to `crc32' 问题消失。

    还有一个就是cjson库的问题。在makefile中编译时加入-lm动态库是能够查找到libcsjon.so连接库的,但是不知为什么直接使用g++命令编译却找不到。

    查看g++/gcc链接时查找路径的规则:

    1) -L指定的路径,从左到右依次查找

    2)由环境变量LIBRARY_PATH指定的路径,使用":"分割从左到右依次查找

    3)/etc/ld.so.conf指定的路径

    4)/lib 和 /usr/lib目录下

    在此我们查看3)中的路径:

    /usr/local/lib

    在此路径下我们可以看到cjson的库文件为:(名称为libcjson.so)

    因此将编译命令改为:

      g++ simulator_client.cpp crc32.cpp -o simulator_client -I../include -lcjson
    编译通过。

    参考地址: https://blog.csdn.net/cserchen/article/details/5503556

  • 相关阅读:
    8.存储器
    7.计算机的总线
    6.计算机的字符与编码集
    5.计算机的计量单位
    JAVA 实用插件
    并发(三)
    并发(二)
    Java 8 Lambda
    并发(一)
    Mybatis(七)-- LRU LFU 算法
  • 原文地址:https://www.cnblogs.com/rohens-hbg/p/10904047.html
走看看 - 开发者的网上家园