我的第一篇帖子,充满了期望:
我正在尝试理解使用gcc进行静态链接、动态链接、共享库和静态库等相关内容。每次我尝试深入探讨此主题时,总会遇到一些我不太理解的东西。
一些实践工作:
一些实践工作:
bash$ cat main.c
#include "printhello.h"
#include "printbye.h"
void main()
{
PrintHello();
PrintBye();
}
bash$ cat printhello.h
void PrintHello();
bash$ cat printbye.h
void PrintBye();
bash$ cat printbye.c
#include <stdio.h>
void PrintBye()
{
printf("Bye bye\n");
}
bash$ cat printhello.c
#include <stdio.h>
void PrintHello()
{
printf("Hello World\n");
}
gcc -Wall -fPIC -c *.c -I.
gcc -shared -Wl,-soname,libcgreet.so.1 -o libcgreet.so.1.0 *.o
ln -sf libcgreet.so.1.0 libcgreet.so
ln -sf libcgreet.so.1.0 libcgreet.so.1
我已经创建了一个共享库。 现在我想将这个共享库与我的主程序链接起来,创建一个可执行文件。
gcc -Wall -L. main.c -lcgreet -o greet
它非常好用,如果我在运行greet之前设置LD_LIBRARY_PATH(或使用rpath选项链接),我就可以让它工作。
然而,我的问题是不同的: 既然我已经使用了共享库,那么难道不能强制在运行时解析符号(术语可能称为动态链接,如书籍“Linkers and Loaders”所述)吗?我明白我们可能不想这样做,因为这会使程序运行缓慢,并且每次运行程序都有开销,但我正在尝试理解这一点,以清楚我的概念。
gcc链接器是否提供任何选项来延迟运行时符号解析?(使用实际要运行程序的库进行操作)(如果库中有任何更改,则编译时可用的库可能与运行时可用的库不同) 我想能够像这样做:
bash$ gcc main.c -I.
(需要什么选项?) 所以我不必给出库名,只需告诉它我想在运行时进行符号解析,所以现在头文件已经足够了,实际库名不需要。
谢谢, 永远学习者。