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

  • 相关阅读:
    在平面中,一个点绕任意点旋转θ度后的点的坐标
    消息队列
    通过注册表修改默认打开方式
    Beagleboneblack的MLO文件干了些啥
    input子系统 KeyPad-Touch上报数据格式与机制
    字符编码
    find命令之exec
    Jmeter(一)-Linux上的安装和使用
    for循环删除linkedlist中的元素。。。。。。
    Java中组装String字符串常用的几种防范
  • 原文地址:https://www.cnblogs.com/aquester/p/9891564.html
Copyright © 2011-2022 走看看