Hierarchical Linking in C

前端 未结 1 2030
后悔当初
后悔当初 2020-12-12 00:54

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         


        
相关标签:
1条回答
  • 2020-12-12 00:56

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

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

    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;}
    

    Compilation and execution

    $ 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)
    $
    

    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.

    0 讨论(0)
提交回复
热议问题