c++编译错误

来源:互联网 发布:万网 域名 转移 编辑:程序博客网 时间:2024/05/18 04:49
一.变量未定义的引用:
    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

0 0