Проблема C ++: «Ошибка внешней C :: C ()», на которую ссылается C: \ C ++ \ CRP.OBJ » - PullRequest
1 голос
/ 21 ноября 2008

Я пытаюсь получить это:

//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 (), на которую ссылается C: \ C ++ \ CRP.OBJ

Ошибка: неразрешенная внешняя 'C :: function (int, int)', на которую ссылается C: \ C ++ \ CRP.OBJ

Я действительно застрял. Помощь v. Высоко ценится!

EDIT:

Спасибо за ваши ответы,

Я использую Borland C ++ 5.5.1 для Win32, через командную строку, я не совсем уверен, что такое компоновщик, это первый раз, когда я пытался это сделать.

Ответы [ 5 ]

3 голосов
/ 21 ноября 2008

Похоже, что ваша фаза соединения пытается создать исполняемый файл только из crp.obj, NOT crp.obj и c.obj.

Как ты это делаешь? Это должно быть что-то вроде (в случае Borland, как упоминалось в редактировании):

bcc32 -ecrp.exe crp.cpp c.cpp

Вам также не нужна строка включения в c.h, единственное, что останавливает бесконечный цикл включения, - это защита включения.

1 голос
/ 21 ноября 2008

Когда вы связываете свою программу, вам нужно связать как файл c.obj, так и файл crp.obj. Вы видите ошибку, потому что для ссылки используется только файл crp.obj.

Какой компилятор вы используете? Если вы используете что-то вроде VisualStudio, то если оба файла c.cpp и crp.cpp находятся в одном проекте, это должно работать. Если вы используете командную строку для сборки, вам нужно связать оба файла, например,

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

для gcc

0 голосов
/ 21 ноября 2008

Спасибо за ваши ответы,

Я использую Borland C ++ 5.5.1 для Win32, через командную строку, я не совсем уверен, что такое компоновщик, это первый раз, когда я пытался это сделать.

EDIT:

** Это то, что я пытался раньше в командной строке 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

**, как предложил Пакс Диабло, и получил это:

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

EDIT: К сожалению! Попытка скомпилировать его неправильно была довольно глупой с моей стороны. Это работает сейчас, хотя. Таким образом, решение, как первоначально предложил Pax Diablo, скомпилировать crp.cpp следующим образом:

    bcc32 -ecrp.exe crp.cpp c.cpp

Проблема решена, спасибо всем, кто ответил!

0 голосов
/ 21 ноября 2008

Хм ... какой компилятор / компоновщик вы используете? Аргументы предоставлены компоновщику? Являются ли файлы частью одного проекта?

0 голосов
/ 21 ноября 2008

Какой компилятор / среду разработки вы используете? Это из командной строки или из IDE?

Вам необходимо убедиться, что вы скомпилировали c.cpp и сказали компоновщику включить c.obj вместе с crp.obj для создания вашего исполняемого файла.

...