Recent

Author Topic: is this an issue? export stdcall function in dynamic library on MAC OS  (Read 4466 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: 1684
  • 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, FPC 3.3.1 macOS 12.0.1 x86_64 Xcode 13.1
Lazarus 2.3, FPC 3.3.1 macOS 12.0.1 aarch64 Xcode 13.1
Lazarus 2.3, FPC 3.2.2 FreeBSD 13.0 amd64 VM
Lazarus 2.3, FPC 3.2.2 FreeBSD 12.2 amd64 VM
Lazarus 2.1 r61574 FPC 3.0.4 Ubuntu 20.04 VM
Lazarus 2.0.10 FPC 3.2.0 Win10 VM

PascalDragon

  • Hero Member
  • *****
  • Posts: 3496
  • 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