On Sunday, 26 March 2023 at 18:49:57 UTC, eXodiquas wrote:
On Sunday, 26 March 2023 at 14:09:19 UTC, Inkrementator wrote:
But you said static bindings are the main portion of bindings we use. So I tried to get static Lua bindings going.
Static Binding != Static Linking. Like I said, the terminology is not noob friendly and funnily enough, you might have taken away from the sentence the opposite of what is true.
To statically bind, you have to do nothing in 99.9% of cases I have never encountered a library before that handles it like the one you posted and does offers dynamic binding.
But for static/ dynamic linking, it's the opposite. If you don't type in a full path, but just
"libs": ["lua"], the compiler will by default pick the shared library if both static and shared are available. In general I would say it doesn't really matter until you want to distribute your app, then you have to think about it.
So TL;DR: Don't bother with static linking. Just say
"libs": ["lua"] and don't worry about it. In the following I try to explain what actually happens in the background, but understanding it is not important in the beginning. The following is only for your interest.
I'm surprised this worked, according to
man ld, the -L flag takes a dir as input, not a full filepath. Can you please post your full dub config? I'm intrigued.
This works perfectly fine. I can also use
"libs": ["lua"] so I don't have to specify the complete path. But now I wonder, do I have to specify all static bindings via linker commands or is there a mechanism which allows me to specify a path where all the libraries can be found? And my other question is, if I have to specify all static libraries by name, how do I know the name of the library? Giving the system path as
lflag is easy, but where does Lua get the
lua name from which works in the
"libs": ["lua"] string?
These questions are related.
"libs": ["lua"] will get translated to the compiler option
\<compiler> -llua, who will search the library search path for files named liblua.so.<Version>, and if it doesn't exist, liblua.a . This is why we have to give full file path of static libraries.
You can check the path here:
ld --verbose|grep SEARCH and can add custom paths via the environment variable LD_LIBRARY_PATH
If you want to give (temporary) priority to static library, you can do so via
ld -Bstatic lib1 -Bdynamic lib2 file.o or if you use a compiler, you have to pass the linkflag, so it's
gdc -Wl,-Bstatic -llib1 file.d.
See: https://stackoverflow.com/questions/6578484/telling-gcc-directly-to-link-a-library-statically (gcc is a C compiler, but many concepts will map to D compilers, and almost all to gdc )
Sidenote: If you use this, you have to always make sure you have an
-Wl,-Bdynamic at the end, as libc should always be linked dynamically.
Problem is, I don't think dub officially supports this. You could try:
"lflags": ["-Bstatic", "-llua", "-Bdynamic"]
But this would be kind of a hack, since now lua shouldn't be listed in the
"libs":" section anymore. This is an artifact of the fact that not many people bother with static linking.
As you see, it's kind of a mess. To make matters worse, depending on the compiler and linker, these options might look different. gcc, ldc and dmd all use some kind of different options, though some stay the same:
-llua will work for every compiler. But I suppose this is one of the reasons why not inserting hacks into dub like above makes sense, since then it can abstract over different compilers for you.
Thanks for answering my noob questions. I've never dealt with bindings and compiler flags in the languages I come from. :P
My pleasure. Answering these has been (un)surprisingly helpful in strengthening my own understanding.
PS: To really understand what is happening, you might want to try manually compiling a hello world program that depends on a library instead of using dub. Some pointers:
dub build -v will print out the compiler and linkflags used.
pkg-config --libs --cflags lua would generate compiler options for you. Use it like
dmd $(pkg-config --libs --cflags lua) program.d
If you decide to try this, I can walk you through it. But remember that it's not that important this is probably all a bit much.