Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Конвертация 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.062 c
3-1240229501
Wood
2009-04-20 16:11
2010.08.27
Помогите с приложение для работы через ADO с бд.


3-1240848334
IGray
2009-04-27 20:05
2010.08.27
Delphi2009 + BDE + Юникод = НЕВОЗМОЖНО??


6-1217938741
leonidus
2008-08-05 16:19
2010.08.27
Извлечение текста из WebBrowser`а


15-1273573286
Дмитрий Белькевич
2010-05-11 14:21
2010.08.27
Возможно ли доступиться из JavaScript к OLE интерфейсам?


15-1264345015
test
2010-01-24 17:56
2010.08.27
Конец света.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский