【发布时间】:2013-11-24 08:40:16
【问题描述】:
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
但是,如果我要删除共享库libfunction.dll,程序仍然可以工作。这怎么可能?我认为共享库的整个想法
是在 RUN TIME 期间借用了 RUN 所需的代码,并且缺少 libfunction.dll 肯定会给我一个缺少库的错误。
为此,我查看了编译器文档但没有帮助
【问题讨论】:
-
从“function.cpp”中删除
include<iostream>并执行gcc -E main.cpp。你会知道#include "function.cpp"做了什么! -
因为 "#include "function.cpp",你甚至没有使用共享库。将#include 与头文件一起使用,并使用头文件来定义接口,而不是实现。另外: "-L" 不正确 - 你想要 "-l"。
-
@paulsm4 是的,确实按照您的建议进行了尝试,即在单独的头文件中声明 function.cpp 并将头文件包含在 main.cpp 中,但这没有任何区别。此外,-L 就像在同一目录中一样工作
-
@mrdigital 你知道
#include做什么吗?了解如何使用dllexport和dllimport,仅仅说确实有效是没有用的。另外,您只需要声明display而不是在main.cpp中定义它 -
@P0W 我猜你是对的。我会尝试学习
dllexport和dllimport并使用import library也许这会有意义。