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.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
也许这会有意义。
【参考方案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())(用于动态链接库操作)(懒加载立即加载)共享库符号动态库