在C程序中使用外部库

在C程序中使用外部库,c,dll,C,Dll,对于我(一个C初学者)来说,看起来一个程序只需在C源文件的顶部声明#include“something.h”就可以神奇地访问外部库。怎么做的 我想使用POSIX库(unistd.h)。我有头文件本身和几个dll,但我不能将它们链接在一起,让编译器(GCC MinGW)找到dll 关于如何生成和链接dll,以及如何将dll与C头连接,以及诸如此类的内容,有什么好的教程吗?您的假设是错误的-头文件并不能让您神奇地访问dll。头文件不是库,仅仅拥有头文件不允许调用它声明的函数。在任何情况下,MinGW

对于我(一个C初学者)来说,看起来一个程序只需在C源文件的顶部声明
#include“something.h”
就可以神奇地访问外部库。怎么做的

我想使用POSIX库(unistd.h)。我有头文件本身和几个dll,但我不能将它们链接在一起,让编译器(GCC MinGW)找到dll


关于如何生成和链接dll,以及如何将dll与C头连接,以及诸如此类的内容,有什么好的教程吗?

您的假设是错误的-头文件并不能让您神奇地访问dll。头文件不是库,仅仅拥有头文件不允许调用它声明的函数。在任何情况下,MinGW都带有unistd.h——您不需要任何额外的头文件或DLL,不过请注意,并非所有POSIX功能都可以在正常的Windows环境中使用。如果您希望在Windows上使用POSIX环境,请使用Cygwin,而不是MinGW。

您的假设是错误的-头文件不能为您提供对DLL的神奇访问。头文件不是库,仅仅拥有头文件不允许调用它声明的函数。在任何情况下,MinGW都带有unistd.h——您不需要任何额外的头文件或DLL,不过请注意,并非所有POSIX功能都可以在正常的Windows环境中使用。如果您希望在Windows上使用POSIX环境,请使用Cygwin,而不是MinGW。

该.h文件仅用于让您的程序知道在编译链接过程中哪些入口点可用

我建议您查看编译器文档,了解如何指定linking.dll


您可能会开始搜索像-l这样的标志来指定要导入的.dll。

该.h文件仅用于让您的程序知道在编译链接过程中哪些入口点可用

我建议您查看编译器文档,了解如何指定linking.dll


您可能会开始搜索像-l这样的标志来指定要导入的.dll。

C这样做很糟糕:将正确的dll与正确的.h文件连接完全取决于程序员。涉及到很多编程/文件系统约定,很容易出错,初学者很难学习


不久前我写了一封信。Windows上的细节不尽相同,但我希望这些概念可能有用。

C这样做很糟糕:将正确的DLL与正确的.h文件连接起来完全取决于程序员。涉及到很多编程/文件系统约定,很容易出错,初学者很难学习


不久前我写了一封信。Windows上的细节不尽相同,但我希望这些概念可能有用。

虽然Neil和Norman的答案在技术上是正确的,但一些编译器,如MSVC,实际上允许纯包含神奇地链接到正确的库。这是通过在included.h文件中使用特殊指令实现的,该指令如下所示:

#pragma注释(lib,“library.lib”)

#pragma注释(链接器“/DELAYLOAD:library.dll”)


然后,编译器将注释嵌入生成的对象文件(.o或.obj),链接器提取注释并将其附加到其选项中。

尽管Neil和Norman的答案在技术上是正确的,但一些编译器,如MSVC,实际上允许纯#include神奇地链接到正确的库。这是通过在included.h文件中使用特殊指令实现的,该指令如下所示:

#pragma注释(lib,“library.lib”)

#pragma注释(链接器“/DELAYLOAD:library.dll”)


编译器然后将注释嵌入生成的对象文件(.o或.obj),链接器提取注释并将其附加到其选项中。

Shock!恐怖程序员必须知道他们在做什么!多么可笑的想法!但是,这当然不是真的——例如,MinGW安排C运行时DLL获得linke,就像我遇到的所有其他C编译系统一样。当然,如果你想使用非标准功能,你必须链接非标准库。@Neil:对。我有点忘记了有些人只使用libc编写程序。当然,现在glibc是一只巨大的臃肿的猪,这是一个比过去更合理的命题。震惊!恐怖程序员必须知道他们在做什么!多么可笑的想法!但是,这当然不是真的——例如,MinGW安排C运行时DLL获得linke,就像我遇到的所有其他C编译系统一样。当然,如果你想使用非标准功能,你必须链接非标准库。@Neil:对。我有点忘记了有些人只使用libc编写程序。当然,现在glibc是一只巨大的臃肿的猪,这是一个比过去更合理的命题。