zoukankan      html  css  js  c++  java
  • gcc和ld 中的参数 --whole-archive 和 --no-whole-archive

    转自gcc和ld 中的参数 --whole-archive 和 --no-whole-archive


    首先 --whole-archive --no-whole-archiveld专有的命令行参数,gcc 并不认识,要通gcc传递到 ld,需要在他们前面加-Wl,字串。

    --whole-archive 可以把 在其后面出现的静态库包含的函数和变量输出到动态库,--no-whole-archive 则关掉这个特性。

    比如你要把 liba.a  libb.a libc.a 输出到 libabc.dll(或libabc.so)时应该这么写:

    libabc.dll:liba.c libb.a libc.a

           gcc  -shared -o $@ -L. -Wl,--whole-archive -la -lb -lc -Wl,--no-whole-archive

    在--whole-archive作用下的库里不能有函数同名。

     

    下面有一个包含Makefile 和c的完整例子:

    #dllMake
    all:ap lib
    exe=main.exe
    dll=libabc.dll
    
    lib:$(dll)
    ap:$(exe)
    
    src=main
    sa = a b c
    $(exe):$(src:%=%.c) $(dll)
     gcc $< -labc -L. -o $@
    $(dll):$(sa:%=lib%.a)
     gcc  -shared -o $@ -L. -Wl,--whole-archive $(sa:%=-l%) -Wl,--no-whole-archive
    lib%.a:%.o
     ar rcs  $@ $<
    %.o:%.c
     gcc $< -g -c -o $@ 
     
    clean:
    # -rm $(sa:%=%.o)
    # -rm $(src:%=%.o) 
     -rm $(sa:%=lib%.a)
     -rm $(dll) 
     -rm $(exe)

    //a.c
    #include <stdio.h>
    int func_a(int arg1)
    {
     printf("a %d
    " , arg1);
     
     return 25*arg1;
    }
    int samefun() 
    {
     printf("%s in %s
    ", __FUNCTION__ , __FILE__ ) ;
    }
     
    // b.c
    #include <stdio.h>
    int func_b(int arg1)
    {
     return 2*arg1;
    }
     
    // c.c
    #include <stdio.h>
    int func_c(int arg1)
    {
     return 3*arg1;
    }
     
    //main.c
    #include <stdio.h>
    int main()
    {
     int arg = 412; 
     int res ;
     printf("start
    ");
     res =  func_a(arg)+func_b(arg)+func_c(arg);
     printf(" %d => %d 
    " , arg , res );
      samefun();
      
     return res;
    }



  • 相关阅读:
    献给需要购买 阿里云产品的朋友
    当硬件没问题的时候,提升电脑运行速度
    IIS网页GZIP压缩
    前端优化-如何计算白屏和首屏时间
    Javascript 思维导图
    总结get和post区别---面试用
    点击切换样式、以及点击自身移除样式效果
    各行换色
    计算器
    无缝轮播图
  • 原文地址:https://www.cnblogs.com/noble/p/4144163.html
Copyright © 2011-2022 走看看