Текущий архив: 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.49 MB
Время: 0.06 c