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
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
相关文章推荐
- VS2005 C++ str.Format 编译错误
- VS2005 C++ str.Format 编译错误
- C++常见编译连接错误
- 卸载IntelC++后出现的VC6编译错误问题
- C++常见编译/链接错误及其解决办法
- C++ 常见编译连接错误的解决!
- C++ 常见编译错误解决办法
- C++编译错误解决方法
- C++编译错误解决方法
- 编译C++出现错误:Cannot open precompiled header file
- c++常见编译错误解决方案
- C++常见错误及编译错误汇集
- linux下c++程序编译错误--理解typename
- 两个C++编译错误及解决办法--does not name a type和field `XX' has incomplete type
- C++编译过程中常见的一些错误
- 诡异的C++ #define编译错误
- C/C++编译时的Link.EXE错误问题与解决方法
- C++中编译LNK错误
- C++常见编译连接错误
- DSP中由C转成C++出现编译 badly formed pragma错误的解决.