c-如何使GCC编译,使二进制文件使用新的共享对象



我的程序有两个C文件。其中一个是另一个使用的库。当我更改库并运行可执行文件时,它不使用新库。以下是代码。

main1.c

#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include "lib.c"
int main()
{
int x = 0;
while (true) {
printf("%dn", x);
sleep(1);
x = func(x);
}
return 1;
}

lib.c

int func(int x)  
{                
return x + 1;
}                

我用这个命令编译库文件。

gcc -fPIC -MMD -shared -o libfunc.so -c lib.c

并使用此命令编译主文件。

gcc -fPIC -MMD -dynamic -L./ -lfunc main1.o

现在我将库文件更改为以下内容。

新建lib.c

int func(int x)  
{                
return x - 1;
}                

我用这个命令再次编译它。

gcc -fPIC -MMD -shared -o libfunc.so -c lib.c

现在,当我运行二进制文件时,我仍然可以看到旧库的输出。如何更改GCC命令,以便二进制文件在想要运行时加载库文件?

$ ./a.out
1
2
^C
$

通过更改来声明函数,而不是包括实现

#include "lib.c"

至:

int func(int x);

然后你只需要构建库和二进制文件:

gcc -fPIC -shared libfunc.c -o libfunc.so
gcc main1.c -lfunc -o main1

并且运行它将报告:

0
1
2
...

为了证明它使用了新的库,请更改libfunc.c,使其增量为2,并仅按上述方式重建库。它现在将返回:

0
2
4
...

我有LD_LIBRARY_PATH=.,所以它从当前目录中获取库。

最新更新