gcc链接多个静态库时glibc符号的多个定义

问题描述 投票:0回答:1

所以我用 gcc 和 ar 制作了两个库:

libwa.a
libws.a

当我在项目中使用

-l
标志链接它们时。我收到此错误:

/usr/bin/ld: .../lib/libws.a(bhns.c.o): in function `atoi':
bhns.c:(.text+0x0): multiple definition of `atoi'; .../lib/libwa.a(axx.c.o):axx.c:(.text+0x0): first defined here
/usr/bin/ld: .../lib/libws.a(bhns.c.o): in function `atol':
bhns.c:(.text+0x20): multiple definition of `atol'; .../lib/libwa.a(axx.c.o):axx.c:(.text+0x20): first defined here
/usr/bin/ld: .../lib/libws.a(bhns.c.o): in function `atoll':
bhns.c:(.text+0x30): multiple definition of `atoll'; .../lib/libwa.a(axx.c.o):axx.c:(.text+0x30): first defined here
/usr/bin/ld: .../lib/libws.a(bhns.c.o): in function `bsearch':
bhns.c:(.text+0x40): multiple definition of `bsearch'; .../lib/libwa.a(axx.c.o):axx.c:(.text+0x40): first defined here
/usr/bin/ld: .../lib/libws.a(bhns.c.o): in function `atof':
bhns.c:(.text+0xc0): multiple definition of `atof'; .../lib/libwa.a(axx.c.o):axx.c:(.text+0xc0): first defined here

似乎当我包含 标头时,它还将

atoi
和其他函数定义为
extern __inline
,它为每个库提供了这些符号的一个定义。因此,存在多个定义链接器错误。

有什么办法可以解决这个问题吗?我认为这不是预期的行为。

c gcc static-libraries glibc libc
1个回答
0
投票

正如约翰指出的那样。我的一个头文件中有一段代码,如下所示:

#   ifndef __attribute__
#       define __attribute__(x)
#   endif

因此,任何

__attribute__()
宏在头文件中都不会扩展为任何内容。

我仍然不确定为什么缺少属性会导致此链接器错误,但该错误仅出现在使用

-Ofast
优化标志编译的目标文件(包括标准库标头)(也许还有其他一些标志,但我尚未检查)

最少的可重现代码

文件A.c:

#ifndef __attribute__
#   define __attribute__(X)
#endif


#include <stdio.h>
#include <stdlib.h>


int foo() {}

文件B.c:

#ifndef __attribute__
#   define __attribute__(X)
#endif


#include <stdio.h>
#include <stdlib.h>


int bar() {}

命令:

gcc -Ofast fileA.c fileB.c

输出

gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 14.2.1 20240910 (GCC)
© www.soinside.com 2019 - 2024. All rights reserved.