Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

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

 
Riply ©   (2010-05-06 10:36) [0]

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

Примерно таким образом, пробую конвертировать с-файл в 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 содержит только простейшие ф-ии.


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


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


кто сказал ?


 
12 ©   (2010-05-06 11:30) [2]

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


 
Riply ©   (2010-05-06 12:17) [3]

> [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 - это и есть наше имя.


 
Riply ©   (2010-05-06 12:37) [4]

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

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


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

Riply ©   (06.05.10 12:17) [3]

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


 
Riply ©   (2010-05-06 13:54) [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".


 
DVM ©   (2010-05-06 14:44) [7]


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


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

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


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


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


ну вот

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

extern "C" int c_sqr(int a)


 
Riply ©   (2010-05-06 20:48) [9]

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

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

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


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

"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 23:13) [11]

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

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.049 c
2-1272244377
Ваше имя
2010-04-26 05:12
2010.08.27
Нужен максимально быстрый и оптимизированый код чт/записи в файл


15-1270632270
Валерий М.
2010-04-07 13:24
2010.08.27
MySQl Server 4


6-1217131439
Надуев Алексей
2008-07-27 08:03
2010.08.27
Сообщение на эл. ящик


2-1265657143
AlexDan
2010-02-08 22:25
2010.08.27
Три memo и один scrollbars..


15-1272065525
Копир
2010-04-24 03:32
2010.08.27
Знаменитое предложение: Отчет об ошибке.