为什么我的 main 找不到共享库中的函数?

Why is my main not finding the functions from my shared library?

我在 4 个不同的文件中有 4 个独立的函数。函数如下所示:

SieveOfEratosthenes.cpp

bool SieveOfEratosthenes(int n) {
//
}

它们都没有包含。在我的 main.cpp 程序中我有

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

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

这是我的 makefile:

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

主要编译错误(在构建共享库 lib.so 之后),错误如下:

‘isPrimeAKS’ was not declared in this scope.

我不明白为什么,因为它们都在提供给编译器的库中。

编辑如果你有同样的问题:在 header 中声明后问题变成

undefined reference to `isPrimeAKS(int)' see the accepted answer why.

首先,函数isPrimeAKS的原型必须main.cpp包含的headers中声明或在main.cpp(至少在它被调用之前)。

其次,你应该link在编译时动态库或在运行时加载它。 的确,g++ -o main main.cpp -L.不linklib.so。您需要添加 -lyourlib 选项。但是,由于此选项忽略前缀 lib 和后缀 .so,您需要将 lib.so 的无效名称更改为有效的名称,例如 libaks.so 然后 link 它与 g++ -o main main.cpp -L. -laks.