gpt4 book ai didi

c - 动态库找不到静态库

转载 作者:太空宇宙 更新时间:2023-11-04 04:58:09 27 4
gpt4 key购买 nike

环境:gcc 版本 4.4.1(Ubuntu 4.4.1-4ubuntu9)

app: Bin(main)调用动态库(testb.so),testb.so包含一个静态库(libtesta.a)。

文件列表:主程序测试.h交流电公元前

然后编译为:

gcc -o testa.o -c a.c

ar -r libtesta.a testa.o

gcc -shared -fPIC -o testb.so b.c

gcc -o main main.c -L. -ltesta -ldl

然后编译成功,但是运行报错:

./main: symbol lookup error: ./testb.so: undefined symbol: print

代码如下:

测试.h

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <dlfcn.h>



int printa(const char *msg);

int printb(const char *msg);

交流

#include "test.h"

int
printa(const char *msg)
{
printf("\tin printa\n");
printf("\t%s\n", msg);
}

公元前

#include "test.h"

int
printb(const char *msg)
{
printf("in printb\n");
printa("called by printb\n");
printf("%s\n", msg);
}

主.c

#include "test.h"


int
main(int argc, char **argv)
{
void *handle;
int (*dfn)(const char *);

printf("before dlopen\n");

handle = dlopen("./testb.so", RTLD_LOCAL | RTLD_LAZY);
printf("after dlopen\n");
if (handle == NULL) {
printf("dlopen fail: [%d][%s][%s]\n", \
errno, strerror(errno), dlerror());
exit(EXIT_FAILURE);
}

printf("before dlsym\n");
dfn = dlsym(handle, "printb");
printf("after dlsym\n");
if (dfn == NULL) {
printf("dlsym fail: [%d][%s][%s]\n", \
errno, strerror(errno), dlerror());
exit(EXIT_FAILURE);
}

printf("before dfn\n");

dfn("printb func\n");

printf("after dfn\n");

exit(EXIT_SUCCESS);
}

最佳答案

如果我在编译静态文件时将 -fPIC 添加到 gcc,那么它运行良好。

关于c - 动态库找不到静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2635601/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com