c++ - 为什么我的 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)”的未定义引用请参阅已接受的答案为什么。
解决方案
首先,函数的原型isPrimeAKS
必须在包含在或开头的头文件中声明(至少在它被调用之前)。main.cpp
main.cpp
其次,您应该在编译时链接动态库或在运行时加载它。确实,g++ -o main main.cpp -L.
不要链接lib.so
。您需要添加该-lyourlib
选项。但是,由于此选项忽略前缀lib
和后缀.so
,因此您需要将无效名称更改为lib.so
有效名称,libaks.so
然后将其与g++ -o main main.cpp -L. -laks
.
推荐阅读
- node.js - 试图从另一个表中获取数据,快照为空
- amqp - 与 LinkName 有什么关系?
- swift - 用字符串中的多个值替换多个字符
- networking - 对 C 类网络进行子网划分
- spring-boot - 实现正常关机功能时面临的问题
- python-3.x - 在 Python 中将多个同级上下文管理器拆分为多行
- android - Android 软键盘 - 使用 onbackpressed 方法
- python - How to convert unsigned byte array to base64 string in ctypes
- python-3.x - 此处不允许映射值 - YAML
- node.js - 在相同链码中的另一个函数中调用链码的函数会导致错误