有关最近GCC编译出现的firstdefine问题
最近在编译项目的时候,出现的first define here的错误。仔细排查了.h文件的define定义等,最后发现是自己定义类的时候写法有问题。因为这个问题浪费了很长时间,所以特别记在这里。
做测试如下:
新建一个目录firstdef,在其中创建文件firstdef.h,代码如下:
#ifndef _FIRSTDEF_H_
#define _FIRSTDEF_H_
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
class CFirstDef
{
public:
void Show();
void Error();
void Test()
{
printf("Test\n");
}
};
void Show()
{
printf("OK\n");
}
#endif
对应建立firstdef.cpp,代码如下:
#include "firstdef.h"
void CFirstDef::Error()
{
printf("Error\n");
}
对应编译成lib库的makefile如下:
SRC_DIR= ./
OBJ_DIR= ./
LIB_DIR= ./
OBJ_EXT= .o
CXXSRC_EXT= .cpp
CSRC_EXT= .c
LIB_EXT= .a
H_EXT= .h
OBJECTS = $(OBJ_DIR)firstdef$(OBJ_EXT)
LIB_TARGET = $(LIB_DIR)libfirstdef$(LIB_EXT)
$(OBJ_DIR)%$(OBJ_EXT): $(SRC_DIR)%$(CXXSRC_EXT)
@echo
@echo "Compiling $< ==> $@..."
$(CXX) $(INC) $(C_FLAGS) -c $< -o $@
$(OBJ_DIR)%$(OBJ_EXT): $(SRC_DIR)%$(CSRC_EXT)
@echo
@echo "Compiling $< ==> $@..."
$(CC) $(INC) $(C_FLAGS) -c $< -o $@
all:$(LIB_TARGET)
$(LIB_TARGET): $(OBJECTS)
all: $(OBJECTS)
@echo
$(AR) rc $(LIB_TARGET) $(OBJECTS)
@echo "ok"
clean:
rm -f $(LIB_TARGET) $(OBJECTS)
编译结果如下:
之后在与firstdef目录平级的地方创建文件test.cpp:
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include "firstdef.h"
using namespace std;
int main(int argc, const char *argv[])
{
CFirstDef t;
t.Show();
t.Error();
return 0;
}
makefile如下:
CXX = g++
TARGET = test
C_FLAGS += -g -Wall
LIB_FLAGS =
INC=-I./firstdef
LIB=-L./firstdef -lfirstdef
all: $(TARGET)
test: test.o
$(CXX) -o $@ $^ $(LIB_FLAGS) $(LIB) $(C_FLAGS)
.cpp.o:
$(CXX) -c -o $*.o $(INC) $(C_FLAGS) $*.cpp
.cc.o:
$(CXX) -c -o $*.o $(INC) $(C_FLAGS) $*.cc
clean:
-rm -f *.o $(TARGET)
编译结果如下:
由此可见,对比Show和Test函数可以发现,Show报错而Test却没有报错。
对于公司同事说如果不用lib而是直接编译.o的话就不会出错,我单独测试了一下,makefile如下:
CXX = g++
TARGET = test
C_FLAGS += -g -Wall
LIB_FLAGS =
INC=-I./firstdef
#LIB=-L./firstdef -lfirstdef
all: $(TARGET)
test: test.o ./firstdef/firstdef.o
$(CXX) -o $@ $^ $(LIB_FLAGS) $(LIB) $(C_FLAGS)
.cpp.o:
$(CXX) -c -o $*.o $(INC) $(C_FLAGS) $*.cpp
.cc.o:
$(CXX) -c -o $*.o $(INC) $(C_FLAGS) $*.cc
clean:
-rm -f *.o $(TARGET)
编译结果如下:
而至于还有公司同事提到如果把Show设置为内联是否就没有问题,我也测试了一下,错误依旧。
有不少的教程都会将函数的实现写在头文件中,如此看来,还真是会给读者们造成许多误读啊。
另附:源代码下载,需要的朋友可以自己研究一下。
以上代码均在windows下g++ 3.4.5编译通过。
建议继续学习:
- 从C语言的Hello World说起 (阅读:6161)
- 关于PHP的编译和执行分离 (阅读:5719)
- gcc的内联汇编取全局变量地址 (阅读:3998)
- 如何在Windows下编译或调试MySQL (阅读:3544)
- 内核编译升级失败了以后的处理方案 (阅读:2925)
- 如何在AIX中编译Perl (阅读:2292)
- 编译安装mysql 5.141源代码,常见两处错误解决 (阅读:2159)
- 在编译php-fpm0.6的时候需要注意的一些问题 (阅读:1958)
- GCC编译错误 (阅读:1894)
- gcc对Template Template Parameters的兼容性 (阅读:1515)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Dante 来源: Vimer
- 标签: firstdefine GCC 编译
- 发布时间:2010-04-27 23:29:02
- [67] Oracle MTS模式下 进程地址与会话信
- [67] Go Reflect 性能
- [67] 如何拿下简短的域名
- [62] IOS安全–浅谈关于IOS加固的几种方法
- [59] 图书馆的世界纪录
- [59] 【社会化设计】自我(self)部分――欢迎区
- [59] android 开发入门
- [56] 视觉调整-设计师 vs. 逻辑
- [49] 给自己的字体课(一)——英文字体基础
- [47] 读书笔记-壹百度:百度十年千倍的29条法则