编辑: ***对不起我发现在发布这个问题时肯定会有一些误解,我想说明我已经意识到这个问题被问过几次,没有一个答案可行对我而言***
我一直在尝试将一个简单的静态库测试链接到我的一个c ++项目,但我似乎无法将其完全正确。我知道这是一个非常普遍的话题,很多人已经提出了类似的问题,但即使在阅读了一些答案后,我仍然不能,因为上帝的爱,弄清楚我做错了什么。
我的代码很简单,首先我有一个名为“Math.cpp”的.cpp源文件,如下所示:
#include "Math.h"
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
int floor(double a) {
return (int) a;
}
int ceil(double a) {
return (int) a + 1;
}
..为此,我制作了一个名为“Math.h”的头文件,如下所示:
#pragma once
int max(int, int);
int min(int, int);
int floor(double);
int ceil(double);
然后我在cmd上使用以下命令编译“Math.cpp”:
g++ -c Math.cpp -o Math.o
...然后将其编译成静态库,如下所示:
ar rcs libMath.a Math.o
在完成所有这些后,我创建了一个名为“Main.cpp”的新c ++源文件,如下所示:
#include <iostream>
#include "Math.h"
int main() {
std::cout << max(9, 8) << std::endl;
return 0;
}
(“Math.h”与“Main.cpp”位于同一目录中)
所以最后为了将“Main.cpp”链接到我的静态库(“libMath.a”),我在cmd中使用以下命令:
g++ -o Main.exe Main.cpp -L. -lMath
但是,此时,它会抛出以下错误:
C:\Users\zalmar\AppData\Local\Temp\ccmOnvyg.o:Main.cpp:(.text+0x18): undefined reference to `max(int, int)'
collect2.exe: error: ld returned 1 exit status
...我无法弄清楚为什么它找不到具体功能的引用。有些人似乎有同样的问题(here for example)。他们的解决方案是在声明库路径之前声明Main.cpp源文件。但是,对我来说情况并非如此,即使我确定在Main.cpp之后我连接了库,它仍然会出现同样的错误。如果有人能指出我可能做错的任何事情,我会非常感激,因为显然我一定是做错了。否则可能是我的MinGW编译器有问题吗?
我还想再次提到这只是一个测试库,我完全清楚从这样一个简单的程序编译整个静态库可能有点过分。我只想弄清楚如何将库链接到我的c ++项目......