From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qk1-x735.google.com (mail-qk1-x735.google.com [IPv6:2607:f8b0:4864:20::735]) by sourceware.org (Postfix) with ESMTPS id A4E36385357B for ; Tue, 11 Oct 2022 14:26:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A4E36385357B Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-qk1-x735.google.com with SMTP id t25so1477689qkm.2 for ; Tue, 11 Oct 2022 07:26:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:to:from:subject:message-id:from:to:cc:subject:date :message-id:reply-to; bh=HhA6OGqyzYB44pSp7dOYkVGccHTTr4f3MhgzvrhIeSI=; b=mKbKuhycKdytO0MC2dMFD+VkWChIY1SpWb+minRpWAPWJk0gMcDerqSaJjx/xNdHWU nVtsUK8wYVasJPd2viZLo+EEWI9sxCLXFvw0vG5TtqTG5uycR8GfK2tx6MRC6Bm/jJI2 sqn7oUJRN3UcJaRIe0pEoP96qyNiyQ/z4QTWON6zytaqEwlxd94Z8zBiN62ajesXujGW pgGj6rawN5MsrwyN/4WaQrQDUxGenXpWyZiQJ3R23zXwXcAN030xtyPTxGo9Tubm0doz s/jl26zmvCNO9CIWJXMDTSmxbNeQ4d8g7DTYDeVMyOEKYzuhtBsO+K5DCSKvX9MVCJXl oGPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:to:from:subject:message-id:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=HhA6OGqyzYB44pSp7dOYkVGccHTTr4f3MhgzvrhIeSI=; b=GMUpmcYyvZtwHs5ixVQX0B9DMV0/YYVsUlqL1sdcPfT9VgdEBvNV3uqjOGXMsa5/fg TiEPHIZZxzrfAJtYeRsjfGQzWRIvHSbC+xZ338VEuzPjf0aq1G8i70oho1zj7kIOzoCU ZIYGEG8xatGckYPYvBIbDc4thRgx51Y4cwmiDdiIWxZG0xtYLNWxhAPXHdhT9SDnZhzD ntD1s0wl8hDZW9h7v1Rv8wGjcyu7iBEMR9S1qXATric8U8kFau0zcuhRucGJZMt++Fpy dfmjlpNjuS5DPfgNkFCyOtaFewEEjD/W3IrookFFkKGydYOvhkxE6H0PSLd9kTY6HZPZ hIHw== X-Gm-Message-State: ACrzQf1gZsQWm5K5zwLKI/MP1Tf2pi0lS3AyfnJSWE5xLok5k/wu/Xgy PTEo8TBMtXXvO30Lo9zVYvKzFzwyuuM= X-Google-Smtp-Source: AMsMyM6dFEW3Jmw4P3/C1AyQTpavg1Sxyfp05CEzj3q064O/44Rc/nPuRA/EDN0OHw8SK3Fm6oQfFQ== X-Received: by 2002:a37:ae87:0:b0:6d1:debe:4cf4 with SMTP id x129-20020a37ae87000000b006d1debe4cf4mr16958432qke.655.1665498370020; Tue, 11 Oct 2022 07:26:10 -0700 (PDT) Received: from [192.168.0.2] ([192.222.225.228]) by smtp.gmail.com with ESMTPSA id s4-20020a05620a254400b006bbc09af9f5sm12948136qko.101.2022.10.11.07.26.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Oct 2022 07:26:09 -0700 (PDT) Message-ID: <0c24f08964acc66a402d94c1b6a389dee4efa163.camel@gmail.com> Subject: Re: Issue with dllexport/dllimport inline function From: xclaesse@gmail.com To: LIU Hao , gcc@gcc.gnu.org Date: Tue, 11 Oct 2022 10:26:08 -0400 In-Reply-To: <88c1e389-8d80-38bd-e1fa-e61d2653da8d@126.com> References: <845fde640ac4cd51c8bb50373f146987b3d26893.camel@gmail.com> <874c106a-41bb-afe6-44a1-d725fdcd583b@126.com> <88c1e389-8d80-38bd-e1fa-e61d2653da8d@126.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.44.4-0ubuntu1 MIME-Version: 1.0 X-Spam-Status: No, score=-1.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Le mardi 11 octobre 2022 =C3=A0 21:35 +0800, LIU Hao a =C3=A9crit=C2=A0: > =E5=9C=A8 2022/10/11 21:28, LIU Hao via Gcc =E5=86=99=E9=81=93: > >=20 > > Did you have any declarations that had no `__gnu_inline__`? GNU > > inline functions are supposed to be=20 > > emitted out of line, even when its address is taken. > >=20 >=20 > This should be 'to be never emitted out of line'. Sorry for that. I have one .c file, part of libglib-2.0-0.dll, that has that line: ``` extern int g_strcmp0 (const char *str1, const char *str2); ``` The header file has that: ``` GLIB_INLINE int g_strcmp0 (const char *str1, const char *str2) { if (!str1) return -(str1 !=3D str2); if (!str2) return str1 !=3D str2; return strcmp (str1, str2); } ``` I now define GLIB_INLINE that way: ``` #if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(GLIB_STATIC_COMPILATION) # define _GLIB_EXPORT __declspec(dllexport) # define _GLIB_IMPORT __declspec(dllimport) #elif __GNUC__ >=3D 4 # define _GLIB_EXPORT __attribute__((visibility("default"))) # define _GLIB_IMPORT #else # define _GLIB_EXPORT # define _GLIB_IMPORT #endif #ifdef GLIB_COMPILATION # define _GLIB_API _GLIB_EXPORT # define GLIB_INLINE __attribute__((__dllexport__)) __attribute__((__gnu_inline__)) extern inline #else # define _GLIB_API _GLIB_IMPORT # if defined(__has_attribute) && __has_attribute(__gnu_inline__) // https://gcc.gnu.org/pipermail/gcc/2022-October/239592.html # define GLIB_INLINE __attribute__((__gnu_inline__)) extern inline # else # define GLIB_INLINE _GLIB_EXPORT extern inline # endif #endif ``` `GLIB_COMPILATION` is defined when compiling libglib-2.0-0.dll but not when compiling other dlls or applications. The linker issue actually happens when linking libglib-2.0-0.dll, multiple definition happens for all .c files that actually uses g_strcmp0: ``` /usr/bin/x86_64-w64-mingw32-ld: glib/libglib-2.0- 0.dll.p/deprecated_grel.c.obj: in function `g_strcmp0': /home/xclaesse/programmation/glib/builddir/../glib/gtestutils.h:245: multiple definition of `g_strcmp0'; glib/libglib-2.0- 0.dll.p/deprecated_gcache.c.obj:/home/xclaesse/programmation/glib/build dir/../glib/gtestutils.h:245: first defined here ```