C++ 问题:“从 C:\C++\CRP 引用的外部错误 'C::C()'。OBJ”

C++ Problem : "Error external 'C::C()' referenced from C:\C++\CRP.OBJ"

提问人: 提问时间:11/21/2008 最后编辑:paxdiablo 更新时间:11/21/2008 访问量:2981

问:

我试图得到这个:

//C.h
#ifndef C_H
#define C_H
#include "c.h"

class C
{
    public:
        C();
        int function(int, int);
};
#endif

定义如下:

//c.cpp
#include "c.h"
C::C()
{
}
int C::function(int a, int b)
{
    return a * b;
}

要在此工作:

//crp.cpp
#include <iostream>
#include "c.h"

void main(void)
{
    C a;
    std::cout << a.function(1, 2);
}

但我得到两个错误

错误:从 C:\C++\CRP 引用的未解析的外部“C::C()”。OBJ的

错误:从 C:\C++\CRP 引用的未解析的外部“C::function(int, int)”。OBJ的

我真的被困住了。帮助v.非常感谢!

编辑:

感谢您的回复,

我正在通过命令行将Borland C++ 5.5.1用于Win32,我实际上不确定链接器是什么,这是我第一次尝试这样做。

C++ 链接器 未解析的外部

评论

0赞 Adam Rosenfield 11/21/2008
从技术上讲,main 应该返回一个 int,而不是 void。你的编译器可能对你很好,让它通过。

答:

0赞 Rob Walker 11/21/2008 #1

您使用的是哪种编译器/开发环境?这是从命令行还是 IDE 中?

您需要确保编译 c.cpp 并告诉链接器将 c.obj 与 crp.obj 一起包含以创建可执行文件。

0赞 Paul Kapustin 11/21/2008 #2

嗯。。。您使用哪个编译器/链接器?提供给链接器的参数? 这些文件是同一项目的一部分吗?

1赞 David Dibben 11/21/2008 #3

链接程序时,需要同时链接 c.obj 文件和 crp.obj 文件。您看到的错误是因为只有 crp.obj 文件用于链接。

您使用的是什么编译器?如果您使用的是 VisualStudio 之类的东西,那么如果 c.cpp 和 crp.cpp 在同一个项目中,它应该可以工作。如果您使用命令行进行构建,则需要链接这两个文件,例如

gcc -o crp.exe c.cpp crp.cpp

对于海湾合作委员会

3赞 paxdiablo 11/21/2008 #4

看起来您的链接阶段正在尝试仅从 crp.obj 而不是 crp.obj 和 c.obj 创建可执行文件。

你是如何应对的?它应该是这样的(在Borland的情况下,如编辑中提到的):

bcc32 -ecrp.exe crp.cpp c.cpp

您也不需要 c.h 中的 include 行,唯一阻止无限包含循环的是 include 保护。

0赞 VileJim 11/21/2008 #5

感谢您的回复,

我正在通过命令行将Borland C++ 5.5.1用于Win32,我实际上不确定链接器是什么,这是我第一次尝试这样做。

编辑:

** 这是我之前在 Windows 命令提示符中尝试的:

C:\c++>bcc32 crp

**结果是这样的:

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland

crp.cpp:

Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

Error: Unresolved external 'C::C()' referenced from C:\C++\CRP.OBJ

Error: Unresolved external 'C::function(int, int)' referenced from C:\C++\CRP.OBJ

** 然后我试了一下:

bcc32 -ecrp.exe crp.cpp c.cpp

**正如 Pax Diablo 所建议的那样,并得到了这个:

C:\c++>bcc32 -ecrp.exe crp.cpp c.cpp

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland

crp.cpp:

c.cpp:

Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

**但是在尝试再次编译 crp.cpp 时,我遇到了与以前相同的错误:

C:\c++>bcc32 crp

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland

crp.cpp:

Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

Error: Unresolved external 'C::C()' referenced from C:\C++\CRP.OBJ

Error: Unresolved external 'C::function(int, int)' referenced from C:\C++\CRP.OBJ

编辑: 哎呀!再次尝试以错误的方式编译它对我来说是相当愚蠢的。不过它现在可以工作了。因此,正如Pax Diablo最初建议的那样,解决方案是像这样编译crp.cpp:

    bcc32 -ecrp.exe crp.cpp c.cpp

问题解决了,感谢所有回复的人!

评论

0赞 paxdiablo 11/21/2008
向我们显示您正在使用的命令行。此外,您应该编辑原始问题以添加此类信息,因为它实际上不是答案(原谅,因为您是新来的:-)。
0赞 Max Lybbert 11/21/2008
“**但是在尝试再次编译 crp.cpp 时......”你为什么试图重复你知道行不通的命令行?由于您使用的是 Linux,只需从“-ecrp.exe”中删除“.exe”并收工即可。
0赞 paxdiablo 11/21/2008
所以步骤(1)做错了,(2)做对了(正如我建议的那样),(3)再次做错 - 对你不起作用?开个玩笑:-)。执行“bcc32 -ecrp.exe crp.cpp c.cpp”后,您就完成了,crp.cpp 和 c.cpp 都已用于创建 crp.exe - 此时只需运行 crp.exe。
0赞 paxdiablo 11/21/2008
@me.yahoo - 不是 Linux,而是 Win32。