所以我用 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
,它为每个库提供了这些符号的一个定义。因此,存在多个定义链接器错误。
有什么办法可以解决这个问题吗?我认为这不是预期的行为。
正如约翰指出的那样。我的一个头文件中有一段代码,如下所示:
# 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)