我在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)的未定义引用看到接受的答案,为什么。
首先,函数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
链接。