Recent

Author Topic: is this an issue? export stdcall function in dynamic library on MAC OS  (Read 4041 times)

cai

  • New Member
  • *
  • Posts: 18
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!

trev

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 1618
  • Former Delphi 1-7, 10.2 user
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.
Lazarus 2.3 2021-08-10 FPC 3.3.1 r49223 macOS 10.14.6 Xcode 11.3.1
Lazarus 2.3 + FPC 3.3.1 24 Sep 2021 macOS 11.6 aarch64 Xcode 13
Lazarus 2.3 2021-08-11 FPC 3.2.2 FreeBSD 13.0 amd64 VMware VM
Lazarus 2.1 r61574 FPC 3.0.4 Ubuntu 20.04 Parallels VM
Lazarus 2.0.10 FPC 3.2.0 Win10 Parallels VM

PascalDragon

  • Hero Member
  • *****
  • Posts: 3384
  • Compiler Developer
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.

Wallaby

  • New Member
  • *
  • Posts: 35
-------------------------------------------
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.

 

TinyPortal © 2005-2018