菜青虫求助:奇怪的问题
在unix环境下编译。
a目录和b目录,
a目录的程序:a.cpp a.h
b目录的程序:b.cpp b.h
我在b.cpp里想调用 a定义的PManager类的genPInvoice(int) 方法。
于是在b.cpp里include "../a/a.h"
然后因为PManager定义在与b不同的namespace,
所以,在b.cpp开头include语句下接着using PManager所在的名字空间
调用方法前创建对象PManager oPManager;
然后是oPManager.genPInvoice(count);//int count;
然后欢快地键入 make
接着就出现了下面的编译问题:
-----------------------------------------------------------------
Undefined first referenced
symbol in file
int thePT::PManager::genPInvoice(int) PInvoiceApp.o
ld: fatal: Symbol referencing errors. No output written to PInvoiceApp
------------------------------------------------------------------------
我把PManager oPManager;这句改成PManager *PPManager=new PManager ;
然后PPManager->genPInvoice(count);//int count;
结果是同样的编译问题。
代码还缺什么没有做?
问题点数:30、回复次数:5Top
1 楼link98091(方正)回复于 2006-12-01 22:50:04 得分 0
我在网上查了一下都是这个最多:
================================================================================
找不到指定的符号,而这些符号,如MAPI_trace又明明是在某个文件中定义过的,
这时可能的原因是在使用c及c++写程序时没有注意后缀名的使用,c语言的后缀名一般为.c
而c++的后缀名很多如.C .cpp等,如果使用c++编程,但又用的是.c的后缀名,仅管你使用
g++来编译(没有指定言),g++对程序中的函数名等处理时仍按c语言的规则来处理,而不
是按c++的名称规则来处理,但是在调用该函数的其它c++文件中,你又使用了.C为后缀名,
那么就可能出现以上错误。
总之一句话,后缀名不要乱用。
================================================================================
我没有.C的文件,都是.cpp 和.hTop
2 楼whatsouta(某疯子)回复于 2006-12-02 05:18:54 得分 0
懒得看你的描述,贴代码Top
3 楼jixingzhong(瞌睡虫·星辰)回复于 2006-12-02 10:01:04 得分 10
make 的时候, a.o 有没有链接进来?Top
4 楼jixingzhong(瞌睡虫·星辰)回复于 2006-12-02 10:02:05 得分 0
OBJS = ???.o a.oTop
5 楼OOPhaisky(异化$渴望成功~~)回复于 2006-12-02 12:27:39 得分 20
于是在b.cpp里include "../a/a.h"
-------------------------------------------------------------------------------
这仅仅是包括了PManager类的相关声明,而声明只对编译器有用,链接器则要看到具体的定义。
也就是说,楼主可以先将b中的b.cpp编译成目标文件b.o,然后在编译a目录中的程序时,使用相应的命令行选项将../b/b.o链接进来。
当然了,如果楼主可以做一个makefile,那就更方便了。Top




