![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Конвертация 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]
> в объектнике имя нормально,
кто сказал ?