2011-01-13 127 views
2

我有一个静态链接dll文件到项目中的问题。我正在使用Builder C++ 6.静态包括dll文件

I've unchecked: 
Project \ Options \ Packages -> Build with runtime packages 
Project \ Options \ Linker -> Use dynamic RTL 
Project \ Options \ CodeGuard -> CodeGuard Validation 

I've also added dll files using Project Manager: 
myProject \ Add -> myFile.dll 

当然,我已经重建了所有更改后的项目,它仍然要求在运行时的一些dll文件。我省略了什么?

+0

DLL代表* Dynamic-link * Library。 – Philipp 2011-01-13 17:41:00

回答

2

当您静态链接到DLL时,实际发生的情况是编译器检测到您的代码正在调用哪个DLL函数,并设置存根指针,然后链接器将其插入到应用程序的IMPORTS表中。在运行时,当您的应用程序运行时,OS加载器将首先通过将引用的DLL加载到内存中并根据需要更新函数指针来修补IMPORTS表(等等)。这发生在应用程序内部的任何代码开始运行之前。如果加载程序无法解析引用,它将显示错误并终止进程。 DLL本身没有被编译到应用程序本身中。它必须保留为外部文件(如果需要,它可以与多个应用程序/进程共享),并安装在OS加载程序可以找到它的位置。这是如何设计使用DLL的。改变项目选项的数量不会改变这一点。

如果您希望将库代码直接编译到应用程序中,则需要创建静态库而不是DLL。

6

不能链接到这样的DLL。您需要先创建一个.LIB,然后链接到该链接。

如果您无法创建.LIB,则可以使用.DEF。请阅读this或Google。

(顺便说一句:生成C++具有相同或类似名称的工具在MSDN上)

0

而不是增加自己的dll,看here如何创建自己的静态库,它可以添加到您的项目。如果你只是拥有dll,不可能创建一个静态库。你只能从一个DLL生成一个导入库,并且你也需要分发这个DLL。

+0

嗯..我写在我的帖子中,我没有选中这些选项,所以据我了解,它可以静态链接。我对吗?但是,你的答案的第二部分清楚地表明,即使通过一个库,我仍然必须包含dll,因为我只有dll。在这种情况下保持动态更简单。 – qlf00n 2011-01-13 14:41:16