Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Конвертация cpp-файла в obj, понятный для Delphi (RAD 2010)


Riply ©   (2010-05-06 10:36:00) 

Здравствуйте !

Примерно таким образом, пробую конвертировать с-файл в obj, и использовать его в Delphi:
1. Создаем файл File1.c сожержащий следующее:

int __export c_sqr(int a)
{
  return a * a;
}

2. Создаем Delphi проект с таким dpr`ом:

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

{$L file1.obj}

function c_sqr(a: Integer): Integer; cdecl; external;

begin
 try
   writeln(c_sqr(101));
 except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
 end;
 readln
end.

3. В опциях проекта (Pre-Build) пишем следующее:
del /F /Q "$(INPUTDIR)File1.obj"
"$(BDS)\bin\bcc32.exe" -D_NO_VCL -Q -c -C8 -o"$(INPUTDIR)File1.obj" -u- -w! -w -Od -v -vi- "$(INPUTDIR)File1.c"

Запускаем это безобразие и все работает. (obj создается. Функция успешно вызывается и отрабатывает)

Теперь, переименовываем File1.c в File1.cpp (везде где нужно) и пытаемся повторить опыт.
Результат: Delphi не видит нашей супер ф-ии, говорит мол не декларирована.
extern "C" {....}, не помогает - в объектнике имя нормально, но Delphi его не видит :(

Подскажите, пожалуйста, как правильно "сконвертировать" cpp в obj ?
P.S.
Полагаем, что наш cpp содержит только простейшие ф-ии.


Riply   (2010-05-06 23:13:00) [1]

> [10] Игорь Шевченко ©   (06.05.10 21:05)
> то есть, в cpp-файле

> extern "C" { int c_sqr(int a); }

> int c_sqr(int a)
> {
>  return a * a;
> }

> тоже не помогает ?

Неа :( По всякому пробовала. И заголовочный добавляла - ни в какую :(
Похоже, придется использовать только С-файлы.


Игорь Шевченко   (2010-05-06 21:05:00) [2]

"To call a C++ function from a C module do this:
extern "C" {
  void the_CPP_function();
}
when you prototype the C++ function within the C++ module."

http://ckw.phys.ncku.edu.tw/public/pub/src/HTML/Languages/Cpp/BC++TechInfo/16052.html

то есть, в cpp-файле

extern "C" { int c_sqr(int a); }

int c_sqr(int a)
{
 return a * a;
}

тоже не помогает ?


Riply   (2010-05-06 20:48:00) [3]

> [8] Игорь Шевченко ©   (06.05.10 15:55)

> ну вот
> почему бы не написать просто
> extern "C" int c_sqr(int a)

Так и пыталась.
Именно с использованием extern "C" имя "нормальное", а без него просто жуть, а не имя :)


Игорь Шевченко   (2010-05-06 15:55:00) [4]


> Т.е. у срр-шного нет PUBDEF  'c_sqr'.


ну вот

почему бы не написать просто

extern "C" int c_sqr(int a)


DVM   (2010-05-06 14:44:00) [5]


> Riply ©   (06.05.10 12:37) [4]


> Во-вторых: позволяет дважды не писать один и тот же код
> на разных языках

dll это тоже позволяют сделать, но более прозрачно и удобно.


Riply   (2010-05-06 13:54:00) [6]

> [5] Игорь Шевченко ©   (06.05.10 13:23)
> ну а тот же дамп от объектного файла, полученного из file1.c посмотреть и сравнить религия не позволяет ?

Религия то позволяет :)
А вот отсутствие знаний, какие именно отличия сущщественны - нет.
Из крамольных (на мой взгляд) вижу только это:
============================================
с-файл:
00015E PUBDEF  'c_sqr'                 Segment: _TEXT:0000
00016D COMENT  Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 2 (02h)
   Dynamic link export (EXPDEF)
     Exported by: name
     Exported Name: c_sqr
00017C LEDATA  Segment: (1) _TEXT          Offset: 0000  Length: 000B
   0000: 55 8B EC 8B 45 08 F7 6D  08 5D C3                  U...E..m.].
00018E LEDATA  Segment: (4) $$BSYMS        Offset: 0000  Length: 0065
============================================
срр-файл:
000171 COMENT  Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 2 (02h)
   Dynamic link export (EXPDEF)
     Exported by: name
     Exported Name: c_sqr
000180 LEDATA  Segment: (4) $$BSYMS        Offset: 0000  Length: 0065


Т.е. у срр-шного нет PUBDEF  'c_sqr'.


Игорь Шевченко   (2010-05-06 13:23:00) [7]

Riply ©   (06.05.10 12:17) [3]

ну а тот же дамп от объектного файла, полученного из file1.c посмотреть и сравнить религия не позволяет ?


Riply   (2010-05-06 12:37:00) [8]

> [2] 12 ©   (06.05.10 11:30)
> а это зачем делать? "в целях, так сказать, общей эрудиции"

Во-первых: "общая эрудиция" еще, вроде, никому не вредила :)
Во-вторых: позволяет дважды не писать один и тот же код на разных языках


Riply   (2010-05-06 12:17:00) [9]

> [1] Игорь Шевченко ©   (06.05.10 11:03)
> кто сказал ?

Нуу... запускаем Comand Promt от RAD Studio таким образом:
tdump -m "E:\Contrivance\C++\Test\File1.obj"
И он выдает следующее:
C:\Program Files\Embarcadero\RAD Studio\7.0\bin>tdump -m "E:\Contrivance\C++\Tes
t\File1.obj"
Turbo Dump  Version 6.3.0.0 Copyright (c) 1988-2009 Embarcadero Technologies, In
c.
        Display of File e:\contrivance\c++\test\file1.obj

000000 THEADR  E:\Contrivance\C++\Test\File1.cpp
000026 COMENT  Purge: Yes, List: Yes, Class: 0   (000h)
   Translator: CodeGear C++ 6.20
00003E COMENT  Purge: Yes, List: Yes, Class: 232 (0E8h)
   Source File 1: E:\Contrivance\C++\Test\File1.cpp  05/06/2010  12:06:05 pm
00006B COMENT  Purge: Yes, List: Yes, Class: 233 (0E9h)
   Dependency File: E:\Contrivance\C++\Test\File1.cpp  05/06/2010  12:06:05 pm
000097 COMENT  Purge: Yes, List: Yes, Class: 233 (0E9h)
   End of Dependency List
00009D LNAMES
   Name  1: '_TEXT'
   Name  2: 'CODE'
   Name  3: ''
   Name  4: '_DATA'
   Name  5: 'DATA'
   Name  6: 'DGROUP'
   Name  7: '_BSS'
   Name  8: 'BSS'
   Name  9: '$$BSYMS'
   Name 10: 'DEBSYM'
   Name 11: '$$BTYPES'
   Name 12: 'DEBTYP'
   Name 13: '$$BNAMES'
   Name 14: 'DEBNAM'
   Name 15: '$$BROWSE'
   Name 16: '$$BROWFILE'
00010B SEGDEF 1 : _TEXT           DWORD PUBLIC  USE32 Class 'CODE'       Length:
0000
000115 SEGDEF 2 : _DATA           DWORD PUBLIC  USE32 Class 'DATA'       Length:
0000
00011F SEGDEF 3 : _BSS            DWORD PUBLIC  USE32 Class 'BSS'        Length:
0000
000129 COMDEF
   Name:  1: 'c_sqr'               virtual(_TEXT) Length: 000b bytes
000136 GRPDEF Group: DGROUP
   Segment: _BSS
   Segment: _DATA
00013F SEGDEF 4 : $$BSYMS         BYTE  PUBLIC  USE32 Class 'DEBSYM'     Length:
0065
000149 SEGDEF 5 : $$BTYPES        BYTE  PUBLIC  USE32 Class 'DEBTYP'     Length:
001e
000153 SEGDEF 6 : $$BNAMES        BYTE  PUBLIC  USE32 Class 'DEBNAM'     Length:
0008
00015D SEGDEF 7 : $$BROWSE        BYTE  PUBLIC  USE32 Class 'DEBSYM'     Length:
0000
000167 SEGDEF 8 : $$BROWFILE      BYTE  PUBLIC  USE32 Class 'DEBSYM'     Length:
0000
000171 COMENT  Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 2 (02h)
   Dynamic link export (EXPDEF)
     Exported by: name
     Exported Name: c_sqr
000180 LEDATA  Segment: (4) $$BSYMS        Offset: 0000  Length: 0065
   0000: 02 00 00 00 34 00 05 02  00 00 00 00 00 00 00 00   ....4...........
   0010: 00 00 00 00 0B 00 00 00  00 00 00 00 09 00 00 00   ................
   0020: 00 00 00 00 01 40 00 00  00 10 00 00 01 00 00 00   .....@..........
   0030: 00 00 00 00 05 63 5F 73  71 72 12 00 00 02 08 00   .....c_sqr......
   0040: 00 00 74 00 00 00 02 00  00 00 00 00 00 00 02 00   ..t.............
   0050: 06 00 11 00 01 00 03 01  00 18 0A 42 43 43 33 32   ...........BCC32
   0060: 20 36 2E 32 30                                      6.20
0001EC FIXU32
   FixUp: 020  Mode: Seg  Loc: Pointer32   Frame: TARGET  Target: VEI[1]: c_sqr

0001F5 LEDATA  Segment: (5) $$BTYPES       Offset: 0000  Length: 001E
   0000: 02 00 00 00 0E 00 08 00  74 00 00 00 00 00 01 00   ........t.......
   0010: 01 10 00 00 08 00 01 02  01 00 74 00 00 00         ..........t...
00021A LEDATA  Segment: (6) $$BNAMES       Offset: 0000  Length: 0008
   0000: 05 63 5F 73 71 72 01 61                            .c_sqr.a
000229 LEDATA  Segment: (16385) 'c_sqr'        Offset: 0000  Length: 000B
   0000: 55 8B EC 8B 45 08 F7 6D  08 5D C3                  U...E..m.].
00023C LINN32  Segment: 'c_sqr'
      3:00000000h       5:00000003h       6:00000009h       0:0000000Bh
00025B MODE32

C:\Program Files\Embarcadero\RAD Studio\7.0\bin>


Как я понимаю, Exported Name: c_sqr - это и есть наше имя.


12   (2010-05-06 11:30:00) [10]

а это зачем делать? "в целях, так сказать, общей эрудиции"


Игорь Шевченко   (2010-05-06 11:03:00) [11]


> в объектнике имя нормально,


кто сказал ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо