zoukankan      html  css  js  c++  java
  • gcc链接参数--whole-archive的作用

    // a.h

    extern void foo();

    // a.cpp

    #include <stdio.h>

    void foo()

    {

        printf("foo ");

    }

    // x.cpp

    #include "a.h"

    int main()

    {

            foo();

            return 0;

    }

    // Makefile

    all: x

    x: x.cpp liba.so

    g++ -g -o $@ $^

    liba.so: liba.a

    g++ -g -fPIC -shared -o $@ $^

    #g++ -g -fPIC -shared -o $@ -Wl,--whole-archive $^ -Wl,-no-whole-archive

    liba.a: a.o

    ar cru $@ $^

    a.o: a.cpp

    g++ -g -c $^

    clean:

    rm -f x a.o liba.a liba.so

    $ make

    g++ -g -c a.cpp

    ar cru liba.a a.o

    g++ -g -fPIC -shared -o liba.so liba.a

    #g++ -g -fPIC -shared -o liba.so -Wl,--whole-archive liba.a -Wl,-no-whole-archive

    g++ -g -o x x.cpp liba.so

    /tmp/cc6UYIAF.o: In function `main':

    /data/jayyi/ld/x.cpp:5: undefined reference to `foo()'

    collect2: ld returned 1 exit status

    make: *** [x] Error 1

    默认情况下,对于未使用到的符号(函数是一种符号),链接器不会将它们链接进共享库和可执行程序。

    这个时候,可以启用链接参数“--whole-archive”来告诉链接器,将后面库中所有符号都链接进来,参数“-no-whole-archive”则是重置,以避免后面库的所有符号被链接进来。

    // Makefile

    all: x

    x: x.cpp liba.so

    g++ -g -o $@ $^

    liba.so: liba.a

    g++ -g -fPIC -shared -o $@ -Wl,--whole-archive $^ -Wl,-no-whole-archive

    liba.a: a.o

    ar cru $@ $^

    a.o: a.cpp

    g++ -g -c $^

    clean:

    rm -f x a.o liba.a liba.so

  • 相关阅读:
    nepenthes用法
    honeydctl命令
    honeyd路由拓扑
    Linux Samba服务器的安装
    honeyd使用
    FreeRTOS 事件标志组
    epoll函数
    Java程序:从命令行接收多个数字,求和并输出结果
    《大道至简》第一章读后感
    【诗词歌赋】 杂感- 贺小妹
  • 原文地址:https://www.cnblogs.com/aquester/p/9891564.html
Copyright © 2011-2022 走看看