Using GCC 4.6.2 [MinGW]
我对动态库有点困惑,我知道他们已经在SO上讨论了很多,但之前的帖子都没有回答我的问题。
让我们举一个简单的例子:
文件1:main.cpp
#include "function.cpp"
using namespace std;
int main()
{
display();
return 0;
}
文件2:function.cpp
#include <iostream>
using namespace std;
void display()
{
cout << "testing..." << endl;
}
然后我会做以下事情:
g++ -c main.cpp -o main.o
g++ -c function.cpp -o function.o
g++ -shared function.o -o libfunction.dll
g++ main.o -Lfunction.dll -o result.exe
执行此操作时,程序可以正常工作。
因此,在目录中我们有文件:main.cpp, function.cpp, main.o, function.o, libfunction.dll
和result.exe
但是如果我要删除SHARED LIBRARY libfunction.dll
,程序仍然有效。怎么可能?我想到了共享库的整个想法
是在RUN TIME期间借用了所需的RUN代码,而libfunction.dll
的缺失肯定会给我一个错误的库错误。
为此,我查看了编译器文档,但没有帮助
答案 0 :(得分:3)
#include "function.cpp"
在 main.cpp 中提供 function.cpp 中的所有定义。
为防止这种情况,请编写一个声明来自 function.cpp 的函数的标头,并在 main.cpp 中包含该标头。然后编译 main.cpp 并链接DLL。有关详细信息,请参阅MinGW网站上的HOWTO Create and Deploy a Sample DLL using MinGW。
答案 1 :(得分:1)
您将function.cpp
包含在main.cpp
文件中。 display()
函数的定义(正文)将被编译并与之链接。
要体验预期的行为(并编写健全的代码),请不要#include
实施文件。将声明拉出到单独的头文件中,并且只包含该头文件。