динамическая библиотека не может найти статическую библиотеку - PullRequest
1 голос
/ 14 апреля 2010

env: gcc версия 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

app: Bin (main) вызывает динамический lib (testb.so), а testb.so содержит статический lib (libtesta.a).

список файлов: main.c test.h a.c b.c

затем скомпилировать как:

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

код следующий:

test.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);

a.c

#include "test.h"

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

b.c

#include "test.h"

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

main.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);
}

1 Ответ

0 голосов
/ 15 апреля 2010

если я добавлю -fPIC к gcc во время компиляции статики, то это будет хорошо работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...