首页 > 解决方案 > 为什么我的 main 没有从我的共享库中找到函数?

问题描述

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

这是我的生成文件:

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-linkingdynamic-library

解决方案


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

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


推荐阅读