Почему мой главный не находит функции из моей общей библиотеки? - PullRequest
0 голосов
/ 15 марта 2020

У меня есть 4 отдельные функции в 4 разных файлах. Функции выглядят так:

SieveOfEratosthenes. cpp

bool SieveOfEratosthenes(int n) {
//
}

Все они не имеют включений. В моей основной. cpp программе у меня есть

//Includes
void compare(bool (*f)(int)) {
//
}

int main(int argc, char **argv) {
  compare(isPrimeAKS);
  compare(isPrimeModulo);
  compare(isPrimeSQRT);
  compare(SieveOfEratosthenes);
  return 0;
}

Это мой make-файл:

all: main clean

main: main.cpp lib.so
    g++ -o main main.cpp -L.

lib.so: EratosthenesSieve.o AKS.o ModuloAlg.o SQRTModuloAlg.o
    g++ -shared -o lib.so AKS.o ModuloAlg.o SQRTModuloAlg.o EratosthenesSieve.o

EratosthenesSieve.o: EratosthenesSieve.cpp
    g++ -c -Wall -fpic EratosthenesSieve.cpp

AKS.o: AKS.cpp
    g++ -c -Wall -fpic AKS.cpp

ModuloAlg.o: ModuloAlg.cpp
    g++ -c -Wall -fpic ModuloAlg.cpp

SQRTModuloAlg.o: ModuloAlg.cpp
    g++ -c -Wall -fpic SQRTModuloAlg.cpp

clean:
    rm -f *.o

Компиляция ошибок в main (после сборки общей библиотеки lib.so) с ошибками вроде :

'isPrimeAKS' не было объявлено в этой области.

Я не понимаю, почему, поскольку все они находятся в библиотеке, предоставляемой компилятору.

РЕДАКТИРОВАТЬ, если у вас возникла та же проблема: после объявления в заголовке проблема становится

неопределенная ссылка на isPrimeAKS (int), см. Принятый ответ почему.

1 Ответ

5 голосов
/ 15 марта 2020

Во-первых, прототип функции isPrimeAKS должен быть объявлен в заголовках, включенных в main.cpp или в начале main.cpp (по крайней мере, до его вызова).

Во-вторых, вы должны связать динамическую библиотеку c во время компиляции или загрузить ее во время выполнения. Действительно, g++ -o main main.cpp -L. не связывают lib.so. Вам нужно добавить опцию -lyourlib. Однако, поскольку этот параметр игнорирует префикс lib и суффикс .so, необходимо изменить недопустимое имя lib.so на что-то действительное, например libaks.so, а затем связать его с g++ -o main main.cpp -L. -laks.

...