Hello,

I was studing how to write the system unit for Symbian OS, and
everything on Symbian is C++, so you actually import lot´s of methods
from classes, not procedures. So I decided to study the task of
linking from Free Pascal to C++

Maybe it´s easy to be implemented, and that would be very nice. Here is my test:

To start with I created a trivial C++ DLL:

File: cpplib.cpp

class User
{
 public:
    __declspec(dllexport) int Sum(int a, int b);
};

int User::Sum(int a, int b)
{
   return a + b;
}

File: build.bat

PATH=C:\Programas\Dev-Cpp\bin
g++ -c cpplib.cpp -o cpplib.o
dllwrap.exe --output-def cpplib.def --driver-name c++ --implib
cpplib.a cpplib.o -L"c:/Programas/dev-cpp/lib" --no-export-all-symbols
--add-stdcall-alias -o cpplib.dll

Calling build.bat will of course produce cpplib.dll It also produces a
cpplib.def

Now, I utilized dllview software I created and saw that cpplib exports
this function: _ZN4User3SumEii

Then, I created a simple pascal software to call that function:

program loadcpp;

{$mode objfpc}{$H+}

{$apptype console}

uses
 SysUtils, ctypes;

function User_Sum(Self: Pointer; a, b: cint): cint; cdecl; external
'cpplib.dll' name '_ZN4User3SumEii';

begin
 WriteLn('7 + 8 = ' + IntToStr(User_Sum(nil, 7, 8)));
end.

And it works!

So, basically, what I mean with this is: What is needed to add C++
linking to Free Pascal? It seams to me that it should be easy, we just
need to understand C++ name mangling and choose a sintax to implement
it. Maybe something like this:

type
 User = class
 public:
   function Sum(a, b: cint): cint; cdecl; external 'cpplib.dll';
cpp_name_mangling;
 end;

One possible problem is C++ multiple inheritance. I would propose
that, to start with, just disconsider it.

Disclaimer: I know very little on the subject, so feel free to correct me =)

thanks,
--
Felipe Monteiro de Carvalho
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to