Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dll's created in Bmax can only be used in Bmax. (missing static lib) #122

Open
Kerntrick opened this issue May 27, 2023 · 0 comments
Open

Comments

@Kerntrick
Copy link

Kerntrick commented May 27, 2023

Most of this description is a copy of what I posted here:
https://discord.com/channels/613699895139762176/679291789840089108/1111856194957627412

I've found a bug with either maxgui, or generating Dll's on windows.
It seems that if you import maxgui.drivers in a dll, only Bmax can load the dll.
Loading by any other non-bmax program will give an error. (126)
I think it's related to a missing library.

Example
Here is a simple dll source in bmax. : https://gist.github.com/Kerntrick/99b1ff8762b1cd847b868733989958c9
Here is a simple C file to load the dll and catch the error. : https://gist.github.com/Kerntrick/f14af49ca175da229d1f94a4b93bbd99

I think the libstdc is not being statically linked as it should. but I'm not a C guy.
image

Doing some research, it seems that adding -static-libstdc++ will not help, as that is not the linking operation.

I've tried adding different options to maxgui.drivers, but nothing seemed to help.

ModuleInfo "CC_OPTS: -static" 
ModuleInfo "CC_OPTS: -Bstatic -lstdc++" 
import "-lstdc++" 
Import "D:\Dev\Lang\BmaxNG\MinGW32x64\lib\gcc\x86_64-w64-mingw32\8.1.0\libstdc++.a"  
Import "D:\Dev\Lang\BmaxNG\MinGW32x64\x86_64-w64-mingw32\lib\libwinpthread.a"

I did get it working (i think) by doing 2 things.

  1. I removed the file libstdc++.dll.a from the mingw dir.

This should force the compiler to really statically link the lib .
The second thing is that I had to declare a function from that lib in the dll to keep the linker from skipping it.

Extern
    Function nanosleep%( req:Byte Ptr, timespec:Byte Ptr)
EndExtern

Then in the dll main function I call this func.

  1. After getting stdc++ to import, the dll failed to work because of a missing reference to libwinpthread .

So I import that lib directly in the dll.

Import "D:\Dev\Lang\BmaxNG\MinGW32x64\x86_64-w64-mingw32\lib\libwinpthread.a"

Here is the modifed example bmax code that I was able to make working.
https://gist.github.com/Kerntrick/2fa0e359304c8bbb1ee6e092b90b9c00

Creating a dll that imports maxgui.drivers, seems to work now with these hacks, but I don't know yet what else I may have broken by removing that lib in mingw.

@Kerntrick Kerntrick changed the title Dll's creating in Bmax can only be used in Bmax. (missing static lib) Dll's created in Bmax can only be used in Bmax. (missing static lib) May 27, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant