C++动态库基础[关闭]

Posted

技术标签:

【中文标题】C++动态库基础[关闭]【英文标题】:c++ dynamic libarary fundamentals [closed] 【发布时间】: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.dllresult.exe

但是,如果我要删除共享库libfunction.dll,程序仍然可以工作。这怎么可能?我认为共享库的整个想法 是在 RUN TIME 期间借用了 RUN 所需的代码,并且缺少 libfunction.dll 肯定会给我一个缺少库的错误。

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

【问题讨论】:

从“function.cpp”中删除include&lt;iostream&gt;并执行gcc -E main.cpp。你会知道#include "function.cpp"做了什么! 因为 "#include "function.cpp",你甚至没有使用共享库。将#include 与头文件一起使用,并使用头文件来定义接口,而不是实现。另外: "-L" 不正确 - 你想要 "-l"。 @paulsm4 是的,确实按照您的建议进行了尝试,即在单独的头文件中声明 function.cpp 并将头文件包含在 main.cpp 中,但这没有任何区别。此外,-L 就像在同一目录中一样工作 @mrdigital 你知道#include 做什么吗?了解如何使用dllexportdllimport,仅仅说确实有效是没有用的。另外,您只需要声明 display 而不是在 main.cpp 中定义它 @P0W 我猜你是对的。我会尝试学习dllexportdllimport 并使用import library 也许这会有意义。 【参考方案1】:

#include "function.cpp" 使 function.cpp 中的所有定义在 main.cpp 中可用。

为防止这种情况发生,请编写一个标头,声明 function.cpp 中的函数,并将该标头包含在 main.cpp 中。然后编译 main.cpp 并链接到 DLL。有关详细信息,请参阅 MinGW 网站上的HOWTO Create and Deploy a Sample DLL using MinGW。

【讨论】:

但否则我该怎么做呢?有直接链接的例子吗?其中不包括 - 使用 (dllexport) 导入库 @mrdigital 查看我的回答。 @Oswald 是的,我在发帖之前确实访问了该页面;我不想使用 IMPORT LIBRARY (dllexport) 方法,而是想对默认导出的所有符号使用直接链接 @Oswald 谢谢你的作品【参考方案2】:

您将function.cpp 包含到main.cpp 文件中。 display() 函数的定义(主体)将与它一起编译和链接。

要体验预期的行为(并编写理智代码),不要#include 实现文件。将声明拉出到单独的头文件中,并且只包含该头文件。

【讨论】:

是的,我也这样做了,但没有任何区别;包含一个头文件,然后在其中声明 function.cpp @mrdigital 现在这没有任何意义。 “里面声明了function.cpp”是什么意思? @H2CO3 我认为 OP 刚刚创建了一个新文件“function.h”,其中定义了display,并将其包含在“main.cpp”中,结果相同 @H2CO3 @POW 实际上不,这不是我的意思。我创建了一个head.h,然后放入#include "function.cpp" @mrdigital 这同样是错误的,它会导致完全与 P0W 指出的行为相同。这不是我在回答中描述的不是。阅读预处理器,你很困惑,你不接受好的建议。

以上是关于C++动态库基础[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Linux C++ libdl.so dlfcn.h使用方法(dlopen()dlsym()dlclose()dlerror())(用于动态链接库操作)(懒加载立即加载)共享库符号动态库

C++基础语法梳理:Windows 的动态链接库

C++静态库与动态库详解

请用c++中的boost编一个动态库

C++中动态库调用动态库如何调用啊

C#总结动态加载C++动态链接库