为什么我的 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
.
我在 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
.