gcc链接参数--whole-archive的作用
2015-11-12 15:53
681 查看
// a.h
extern void foo();
// a.cpp
#include <stdio.h>
void foo()
{
printf("foo\n");
}
// 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
extern void foo();
// a.cpp
#include <stdio.h>
void foo()
{
printf("foo\n");
}
// 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
相关文章推荐
- linux的awk指令(个人案例)
- Prime C++ Exercise 2.11 编写程序,要求用户输入两个数——底数(base)和指数 (exponent),输出底数的指数次方的结果。
- [Windows Server 2008] IIS自带FTP配置方法
- fragment中onCreateView与onActivityCreated的区别,以及fragment中生命周期的利用
- WebRTC中最简单loopback摄像头&麦克风的例子
- 行内元素
- 给定字典做分词
- [Cocoa]_[初级]_[如何复制NSView]
- 函数做游戏
- swift之数值类型杂谈(数值)
- [Cocoa]_[初级]_[如何复制NSView]
- pom.xml
- VS中宏 _T、TEXT,_TEXT、L 的作用:
- 我的简单swift爬虫类
- 文法评论
- 图片翻页效果引出的animate.css,很好玩,多动动吧~
- redis配置不当可导致服务器被控制
- BZOJ 2001 [Hnoi2010]City 城市建设 LCT+分治(未成功卡时卡过)
- JAVA EE架构师 需要具备的知识
- Introduction to Algorithm - Summary of Chapter 2(1) - Insertion sort