为什么我的主要组织没有从共享库中找到函数?

问题描述 投票:0回答:1

我在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

在main上编译错误(在构建共享库lib.so之后),并且出现类似以下错误:

'isPrimeAKS'未在此范围内声明。

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

如果有相同的问题,请编辑:在标头中声明问题后变为

对`isPrimeAKS(int)的未定义引用看到接受的答案,为什么。

c++ dynamic-linking dynamic-library
1个回答
2
投票

首先,函数isPrimeAKS的原型必须在main.cpp包含的头中或main.cpp的开头(至少在调用它之前)declared

第二,您应该在编译时链接动态库或在运行时加载它。实际上,g++ -o main main.cpp -L.不链接lib.so。您需要添加-lyourlib选项。但是,由于此选项将忽略前缀lib和后缀.so,因此您需要将lib.so的无效名称更改为类似于libaks.so的有效名称,然后将其与g++ -o main main.cpp -L. -laks链接。

© www.soinside.com 2019 - 2024. All rights reserved.