Van*_*Van 2 c linker compiler-errors
我想以分层方式链接三个文件.
// 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}
Run Code Online (Sandbox Code Playgroud)
所以,我先将三个文件分别编译成目标文件a.o,b.o然后main.o.然后我想结合a.o并b.o进入另一个目标文件tools.o.并最终使用tools.o并main.o生成可执行文件.
但是,当我尝试结合a.o并b.o喜欢时ld -o tools.o a.o b.o,链接器说undefined reference to 'parameter'.我怎么能将这些目标文件链接到一个中间目标文件?
您希望该-r选项生成可重定位目标文件(想想'可重用'):
ld -o tools.o -r a.o b.o
Run Code Online (Sandbox Code Playgroud)
extern void fun1(void);
extern void fun2(void);
extern void fun3(void);
extern int parameter;
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include "abmain.h"
void fun1(void){printf("%s\n", __func__);}
void fun2(void){printf("%s\n", __func__);}
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include "abmain.h"
void fun3(void){printf("%s (%d)\n", __func__, ++parameter);}
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include "abmain.h"
int parameter = 1;
int main(void){fun1();fun3();fun2();fun3();return 0;}
Run Code Online (Sandbox Code Playgroud)
$ 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)
$
Run Code Online (Sandbox Code Playgroud)
在Mac OS X 10.11.6上使用GCC 6.1.0(以及XCode 7.3.0加载程序等)进行了验证.但是,至少从第7版Unix(大约1978年)起,该-r选项一直在ld主流Unix 的命令中,所以它很可能适用于大多数基于Unix的编译系统,即使它是更广泛使用的选项之一.
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |