您的位置:首页 > 编程语言 > C语言/C++

c++编译错误

2017-01-17 11:10 134 查看
一.变量未定义的引用:

    1.如果变量是类中的静态成员,需要先在类外部初始化。否则会出现此种错误

二。头文件包含了,却报

    zsp_ipc_proxy_client.hh:8:1: 错误:expected class-name before ‘{’ token

    代码:class ZSP_IPC_Proxy_Client : public ZSP_IPC_Host

    解决:需要提前声明类:class ZSP_IPC_Host;

     头文件包含其实是一想很烦琐的工作,不但我们看着累,编译器编译的时候也很累,再加上头文件中常常出现的宏定义。感觉各种宏定义的展开是非常耗时间的,远不如自定义函数来得速度。这里仅就不同头文件、源文件间的句则结构问题提出两点原则,仅供参考:

    第一个原则应该是,如果可以不包含头文件,那就不要包含了。这时候前置声明可以解决问题。如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知。

    第二个原则应该是,尽量在CPP文件中包含头文件,而非在头文件中。假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类B的前置声明并编译成功,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非声明部分(H文件)。

    

三。在zsp_code/policy下编译出现:

    /work/zsp_code/zsp/lib/libxorp_ipc.so:对‘make_cookie()’未定义的引用

    描述:在libxorp_ipc下的一个文件zsp_ipc_proxy_client.cc使用了libxorp_finder下的一个文件finder.cc中的函数make_cookie(),zsp_ipc_proxy_client.cc已经#include "finder.hh".
    解决,在policy的makefile中需要引用到libxorp_finder

四:c++调用c动态库

1.c++程序使用一个c动态库中的函数,编译爆出错误:

    info-collect.cpp:(.text+0xd1b): undefined reference to `waf_log_client_connect(char*)'

2.分析

    waf_log_client_connect是c动态库中函数。如何要在c++中使用,需要在头文件中用extern "C"声明

总结:c++调用c动态库过程:

    1.makefile中连接:动态库为libcommon

    CFLAGS = -g3

    target = info-collect_new

    INCLUDE = -I /usr/local/waf/common/include

    lib = -lcommon -lpthread

    dirlib = -L /usr/lib/x86_64-linux-gnu/ -L /usr/local/waf/common/lib/

    object = $(patsubst %.cpp,%.o,$(wildcard *.cpp))

    $(target):$(object)

         g++ $(CFLAGS) $(INCLUDE) $(object)  -o $(target) $(dirlib) $(lib)

    $(object):%.o:%.cpp

         g++ $(CFLAGS) $(INCLUDE) -c $< -o $@

    .PHONY : clean

    clean:

         rm $(object) $(target)

    2.要在c++程序头文件info-collect.h中使用extern "C"声明这些函数。

    #ifdef __cplusplus

    extern "C" {               // 告诉编译器下列代码要以C链接约定的模式进行链接

    #endif

    int waf_log_client_connect(char* server_path);

    int waf_log_client_write(int fd, char* process_name, int is_deffered, char *content);

    int waf_log_client_check_conn(int fd);

    void waf_log_client_destroy(int fd);

    #ifdef __cplusplus

    }

    #endif

    注意不能包含这些函数所在库的头文件。比如info-collect.h不能有#include "waf_log_client.h"。否则会报错:

    error: previous declaration of ‘int waf_log_client_connect(char*)’ with ‘C++’ linkage

    info-collect.h:24:45: error: conflicts with new declaration with ‘C’ linkage
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: