c ++动态库基础知识

时间:2013-11-24 08:40:16

标签: c++ gcc dll g++ mingw

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.dllresult.exe

但是如果我要删除SHARED LIBRARY libfunction.dll,程序仍然有效。怎么可能?我想到了共享库的整个想法 是在RUN TIME期间借用了所需的RUN代码,而libfunction.dll的缺失肯定会给我一个错误的库错误。

为此,我查看了编译器文档,但没有帮助

2 个答案:

答案 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实施文件。将声明拉出到单独的头文件中,并且只包含该头文件。