Я пишу общую библиотеку для Linux (64-разрядная версия) с C11.
Я создал 3 файла C и H.
dll.c
#include "dllman.h"
void start(){
pipeListeningThreadFunc( NULL );
}
dllman.h
#include <stdio.h>
void* pipeListeningThreadFunc( void* args );
dllman.c
#include "dllman.h"
void* pipeListeningThreadFunc( void* args ){
printf("Blah");
return NULL;
}
Компиляция кода следующим образом
gcc -std=gnu11 -c -Wall -Werror -fpic -lpthread dll.c
gcc -std=gnu11 -shared -fpic -o dll.so dll.o
Все в порядке до этого момента. dll.so
файл создан. Но когда я использую функцию dlopen
для загрузки библиотеки как:
тест.д
...
void* lh = dlopen("./dll.so", RTLD_NOW | RTLD_GLOBAL);
...
dlerror
дает мне: ошибка dlopen: ./dll.so: неопределенный символ: pipeListeningThreadFunc
Я не понимаю, что в этом плохого.
Чтобы понять проблему, я перенес реализацию функции pipeListeningThreadFunc
в dllman.h
и скомпилировал таким же образом. На этот раз все работает исправно.
Что не так с определением функции как прототипа? Почему он не может найти функцию, если она определена как прототип в файле заголовка и реализована в файле C?