C中的层次链接 [英] Hierarchical Linking in C

查看:84
本文介绍了C中的层次链接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想以分层方式链接三个文件.

I want to link three files but in hierarchical way.

// a.c
int fun1(){...}
int fun2(){...}

// b.c
extern int parameter;
int fun3(){...//using parameter here}

// main.c
int parameter = 1;
int main(){...// use fun1 fun2 fun3}

因此,我首先将三个文件分别编译为目标文件a.ob.omain.o.然后,我想将a.ob.o组合到另一个目标文件tools.o中.并最终使用tools.omain.o生成可执行文件.

So, I first compile three files separately into object file a.o, b.o and main.o. And then I want to combine a.o and b.o into another object file tools.o. And eventually use tools.o and main.o to generate executable file.

但是,当我尝试像ld -o tools.o a.o b.o一样组合a.ob.o时,链接器说undefined reference to 'parameter'.如何将这些目标文件链接到中间目标文件中?

But, when I try to combine a.o and b.o like ld -o tools.o a.o b.o, the linker says undefined reference to 'parameter'. How could I link those object files into an intermediate object file?

推荐答案

您希望-r选项生成可重定位的目标文件(认为是可重用"):

You want the -r option to produce a relocatable object file (think 'reusable'):

ld -o tools.o -r a.o b.o


工作代码

abmain.h


Working code

abmain.h

extern void fun1(void);
extern void fun2(void);
extern void fun3(void);
extern int parameter;

a.c

#include <stdio.h>
#include "abmain.h"
void fun1(void){printf("%s\n", __func__);}
void fun2(void){printf("%s\n", __func__);}

b.c

#include <stdio.h>
#include "abmain.h"
void fun3(void){printf("%s (%d)\n", __func__, ++parameter);}

main.c

#include <stdio.h>
#include "abmain.h"

int parameter = 1;
int main(void){fun1();fun3();fun2();fun3();return 0;}

编译和执行

$ gcc -Wall -Wextra -c a.c
$ gcc -Wall -Wextra -c b.c
$ gcc -Wall -Wextra -c main.c
$ ld -r -o tools.o a.o b.o
$ gcc -o abmain main.o tools.o
$ ./abmain
fun1
fun3 (2)
fun2
fun3 (3)
$

在具有GCC 6.1.0(和XCode 7.3.0加载程序等)的Mac OS X 10.11.6上进行了验证.但是,至少从第7版开始,主流Unix上的ld命令中一直使用-r选项. Unix (大约在1978年),因此即使它是更广泛使用的选项之一,它也可能在大多数基于Unix的编译系统中可用.

Proved on Mac OS X 10.11.6 with GCC 6.1.0 (and the XCode 7.3.0 loader, etc). However, the -r option has been in the ld command on mainstream Unix since at least the 7th Edition Unix (circa 1978), so it is likely to be available with most Unix-based compilation systems, even if it is one of the more widely unused options.

这篇关于C中的层次链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆