Le mercredi 12 octobre 2022 à 01:42 +0800, LIU Hao a écrit : > 在 2022-10-11 22:26, xclae...@gmail.com 写道: > > #ifdef GLIB_COMPILATION > > # define _GLIB_API _GLIB_EXPORT > > # define GLIB_INLINE __attribute__((__dllexport__)) > > __attribute__((__gnu_inline__)) extern inline > > This is not correct. Typically, `dllexport` indicates that 'I want an > external definition' but > `gnu_inline` indicates that 'I do not want an external definition', > so it's a contradiction: you get > either multiple definitions, or none (which causes undefined > references).
Sorry, that was a wrong copy/paste when writing the email (leftover of things I tried previously). I can confirm the multiple definition error I have is when that line is `# define GLIB_INLINE _GLIB_EXPORT extern inline`, which expands to `__declspec(dllexport) extern inline`. > To user code which imports such a function, it should be seen as > > ``` > __attribute__((__gnu_inline__)) > extern inline > int g_strcmp0(const char*, const char*) > ``` > > This has the desired effect: The function can be inlined where > appropriate. And if not, a call to > the external thunk is emitted; no weak definition is emitted in > either case. > > > To the library itself which exports it, it should be seen as > > ``` > __attribute__((__dllexport__)) > extern inline > int g_strcmp0(const char*, const char*) > ``` > > There is no `gnu_inline` in this case. GCC always generates a > COMDAT/weak/linkonce definition, which > will not cause multiple definition errors. Right, that's what I do and it fails. I made a simplified example: https://gitlab.gnome.org/xclaesse/inline-example Build it with: meson setup builddir --cross-file cross_file_mingw64.txt ninja -C builddir/ And it fails with: ``` x86_64-w64-mingw32-gcc -o libfoo.dll libfoo.dll.p/foo.c.obj libfoo.dll.p/bar.c.obj -Wl,--allow-shlib-undefined -shared -Wl,--start- group -Wl,--out-implib=libfoo.dll.a -fstack-protector -lkernel32 - luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid - lcomdlg32 -ladvapi32 -Wl,--end-group /usr/bin/x86_64-w64-mingw32-ld: libfoo.dll.p/bar.c.obj: in function `g_strcmp0': /home/xclaesse/programmation/inline-example/builddir/../foo.h:5: multiple definition of `g_strcmp0'; libfoo.dll.p/foo.c.obj:/home/xclaesse/programmation/inline- example/builddir/../foo.h:5: first defined here ``` Thanks for your help!