Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > [Linker Error] Unresolved external '


Автор: Gunslinger 10.10.2008, 12:06
Новая ошибка.
Код

#include "myExcel.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 myExcel p;
 p.InitMyExcel();
}

Пишет [Linker Error] Unresolved external 'myExcel::InitMyExcel()' referenced from D:\ТЕСТИРУЮ КЛАСС MYEXCEL\UNIT1.OBJ и подозреваю так будет со всеми методами.
Может каких билдеровских директив в myExcel добавить нужно? В гугле говорят, что в через Project\Add to project нужно что-то добавить из lib. Но у меня ни компонентов, ни dll - только функции.

Автор: azesmcar 10.10.2008, 12:37
может покажешь файл myExcel.h и его реализацию или это тайна? а именно обьявление и реализация функции InitMyExcel.

Добавлено через 37 секунд
кстати не забыл включить myExcel.cpp в проект?

Автор: Gunslinger 10.10.2008, 13:31
azesmcar, не знал. Получается main - это файл проекта. Тогда зачем хедер добавлять в unit1.cpp? Это нюанс билдера?
Теперь вместо ошибки линкера другие: E2293 ) expected, да E2303 Type name expected.
+Нужно comobj.hpp объявлять в юнит1? 

myExcel.h:
Код

//Получить ячейку
#ifndef myExcelH
#define myExcelH

class myExcel
   {
     public:
            bool InitMyExcel();//true - не установлен эксел, false - все нормально
            bool InitFile(String& XlsFileName); //---[color=red][C++ Error] myExcel.h(9): E2293 ) expected[/color]
            bool ConvertField(int x,int y, String& Text); //-----[color=red][C++ Error] myExcel.h(10): E2303 Type name expected[/color]
            bool AmountColumn(int x, int y, int amount);//проверяет количество полей
            int KolZap(int x, int y);
            int SeachFieldsData(String& CellName);//ищет ячейку с датой
            int SeachFields(String& CellName);//ищет ячейки. присвоение внешней переменной (возможно структуре имя-адрес)
            //int
     };
#endif


myExcel.cpp (на всякий случай):
Код

#include "myExcel.h"
#include <comobj.hpp>

class myExcel {
    private:
           Variant myExcel;
           Variant myWorkBook;
           Variant myWorkSheets;
           Variant myCell;

           int flagKolZap=0;
           bool flagNotEndJob=true;//âûãðóçêà èç ýêñåëà íå çàêîí÷åíà

           //String
};

bool myExcel::InitMyExcel()
{
 try
    {
      myExcel = CreateOleObject("Excel.Application");
    }
  catch(...)
    {
     return true;
    };
   return false;
};

bool myExcel::InitFile(String& XlsFileName)
{
  myWorkBook=myExcel.OlePropertyGet("WorkBooks");
  try
     {
       myWorkBook.OleProcedure("Open", XlsFileName.c_str());
       
     }
     catch(...)
          {
             return true;
          };
   myWorkSheet=myExcel.OlePropertyGet("WorkSheets");
   myCell=myExcel.OlePropertyGet("Cells");
   return false;
};

Автор: azesmcar 10.10.2008, 14:02
как зачем? а как он по твоему догадается что этот файл компилировать нужно?

на какой строке он ошибку выдает? коментарий какой нибудь напиши

Автор: Gunslinger 10.10.2008, 14:37
на листинге myExcel.h написал. Цветом выделить не получилось. Строки 9 и 10. Курсор за & становится.

Автор: volvo877 10.10.2008, 14:48
Gunslinger, ситуация: Билдер начинает компилировать файл myExcel.cpp, и встречает тип String, который описывается в файле sysmac.h ... Что делать компилятору (без #include <system.hpp> он и не догадывается, что String - это тип)? То, что он и делает: выдавать сообщения об ошибках... Подключи system.hpp и все будет в порядке...

Автор: Gunslinger 10.10.2008, 15:26
volvo877, спасибо, помогло. Теперь уточнения:
1. В консольнике (я студентил только в турбо с) класс объявляется прописыванием только в main файл. В билдере же хедер нужно прописать и в юнит1.спп, и в проект. Проект в билдере является аналогом main-файла? И если да, то зачем прописвать хедер еще и в юнит1?
2. myExcel.cpp - это реализация h файла. Логично прописывать инклуды (system.h) в хедере, имхо. Но в хедере не заработало. Это логика С++, прописывать сторонние заголовки в реализации?
3. Если один и тот же хедер прописан и в подключаемом классе, и в другом юните, то он загрузится в память дважды или компилятор не даст?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)