gpt4 book ai didi

c - 链接 C 程序时使用第一个出现的实现

转载 作者:太空宇宙 更新时间:2023-11-04 00:46:44 24 4
gpt4 key购买 nike

我有 a.h 和 a.c 给出了函数的接口(interface)和实现

//a.h
#ifndef A_H
#define A_H
int op();
#endif

//a.c
#include "a.h"
int op(){
return 1;
}

同样,我有 b.h 和 b.c,它们给出了同名函数的接口(interface),但具有不同的实现

//b.h
#ifndef B_H
#define B_H
int op();
#endif

//b.c
#include "b.h"
int op(){
return 2;
}

现在,我想将它们与主程序链接起来

#include <stdio.h>

int op();

int main(){
printf( "returned = %d\n ", op());
}

为此,我首先将 a.c 和 b.c 分别编译为 a.o 和 b.o。

gcc -c a.c; gcc -c b.c

然后我试图将它们链接在一起。这里通常的目标是让 main.c 使用链接命令中最先出现的实现来选择“op”的实现。所以,理想情况下:

gcc a.o b.o main.c 应该给我一个执行时返回 1 的可执行文件,gcc b.o a.o main.c 应该给我一个执行时返回 2 的可执行文件执行。但是我收到错误消息

ld: 1 duplicate symbol for architecture x86_64

对此我其实并不感到意外。我的问题是:如何让 main.c 使用第一个出现的实现?谢谢。

最佳答案

一个选项:

  1. 创建两个静态库 -- 一个来自 a.o,一个来自 b.o

    ar libA.a a.o
    ar libB.a b.o
  2. 在链接行中,使用您希望在其他库之前获得更高优先级的库。

    gcc main.c -L. -lA -lB

关于c - 链接 C 程序时使用第一个出现的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35230644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com