Lazarus
Installation => macOS / Mac OS X => Topic started by: cai on June 25, 2021, 10:42:40 am
-
create a library project A
there is a function like this:
function func(): Integer;stdcall;
begin
Result := 0;
end;
exports
func;
-------------------------------
create an application B
use code like:
var
func: function (): Integer;stdcall;
begin
func = GetProcAddress(LoadLirary ('/libA.dylib'), 'func');
if Assigned(func ) then
ShowMessage('func Assigned')
else
ShowMessage('func not Assigned')
end;
run & show "func not Assigned".
-------------------------------------------
if use cdcel instead of stdcall, will show "func Assigned"
-------------------------------------------
or, if change exports code like this:
exports
func name '_func';
also work!
-
If you use "cdecl", FPC ensures that your function completely adheres to all ABI requirements (naming, parameter passing, etc). If you don't, then you are on your own.
-
Please note that stdcall is only relevant on i386. For all other targets stdcall is a synonym for cdecl. As macOS nowadays is 64-bit only, simply use cdecl.
-
-------------------------------------------
if use cdcel instead of stdcall, will show "func Assigned"
-------------------------------------------
or, if change exports code like this:
exports
func name '_func';
also work!
One of the conventions (i.e. stdcall or cdecl) will add an underscore to the function's name. I am guessing that's coming from the linker (ld). Like others said, use cdecl, since stdcall is not designed for anything other than 32-bit Intel CPUs.