编译语言基础知识

时间:2009-09-14 02:07:02

标签: c dll

拜托,有人可以向我解释一些关于使用像C这样的语言的基本知识吗?特别是在Windows上?

  1. 如果我想使用其他库,我需要从库中获得什么?头文件.h和..?

  2. .dll和.dll.a之间的区别是什么? .dll和.lib? .dll和.exe?什么是.def?

  3. 库是如何编译的?我的意思是,是否可以在Windows上使用由VC编译的C ++库,在我的MinGW编译的C代码中?

  4. 要使用其他库,首选方式是什么? LoadLibrary()或#include<>?

  5. 有些库只提供源代码或.dll - 如何使用这些库?每次重建项目时都需要重新编译它们吗?

  6. 如何创建一个大的.exe?这被称为“静态链接”吗?

  7. 如何将一些随机文件包含到.exe中?说一个节目图标或启动歌曲?

  8. 如何将我的巨大.c拆分成较小的?我是否需要为每个部分创建一个头文件,然后我将其包含在WinMain()或main()部分中?

  9. 如果有一个库需要另一个库,是否可以将这两个文件组合成一个文件?比方说,python26.dll需要msvcr90.dll和Microsoft.VC90.CRT.manifest

  10. 如果我不释放以前分配的内存会怎样?如果程序(进程)死了,这会被清理吗?

  11. 嗯,这么多问题......感谢您的每一个信息!

3 个答案:

答案 0 :(得分:3)

  

1:如果我想使用其他库,我需要从库中获得什么?头文件.h和..?

...并且,通常是一个*.lib文件,您将其作为参数传递给链接器。

  

2:.dll和.dll.a之间有什么区别? .dll和.lib? .dll和.exe?什么是.def?

这可能很有用:Static libraries, dynamic libraries, DLLs, entry points, headers … how to get out of this alive?

  

3:库是如何编译的?我的意思是,是否可以在Windows上使用由VC编译的C ++库,在我的MinGW编译的C代码中?

是的,这很重要。对于编译器之间的互操作,通常的方法是使用C风格(非C ++风格)API,具有明确定义的参数传递约定(例如__stdcall),或使用“COM”接口。

  

4:要使用其他库,首选方式是什么? LoadLibrary()或#include<>?

#include用于编译器(例如,以便它可以编译对库的调用);和LoadLibrary(或使用*.lib文件)用于运行时链接器/加载器(以便它可以将这些库方法的实际地址替换为您的代码):即您需要两者。

  

5:有些库只提供源代码或.dll - 如何使用这些库?每次重建项目时都需要重新编译它们吗?

如果它只是源代码,那么您可以将该源代码(一次)编译到库中,然后(当您构建项目时)链接到该库(不重新编译库)。

  

6:如何创建一个大的.exe?这被称为“静态链接”吗?

是的,编译所有内容并将其全部传递给链接器。

  

7:如何在.exe中包含一些随机文件?说一个节目图标或启动歌曲?

在Windows特定的“资源文件”中定义,由“资源编译器”编译。

  

8:我如何将我的巨大的.c分成小的?我是否需要为每个部分创建一个头文件,然后我将其包含在WinMain()或main()部分中?

  

9:如果有一个库需要另一个库,是否可以将这两个文件组合成一个文件?比方说,python26.dll需要msvcr90.dll和Microsoft.VC90.CRT.manifest

我不明白你的问题/例子。

  

10:如果我没有释放以前分配的内存,会发生什么?如果程序(进程)死了,这会被清除吗?

答案 1 :(得分:1)

如果我想使用其他库,我需要从库中获得什么?头文件.h和..?

对于C,C ++,您需要标题.h或.hpp,尽管某些语言不需要头文件。您还需要.a,.so,.dll,.lib,.jar等文件。这些文件包含链接器可以链接到程序的机器代码。不用说链接器必须理解库的格式。

.dll和.dll.a之间的区别是什么? .dll和.lib? .dll和.exe?什么是.def?

dll和.a是库文件,包含可以链接到您自己的程序的代码组件。 .exe是.a或.dll已经链接的最终程序。

库是如何编译的?我的意思是,是否可以在Windows上使用由VC编译的C ++库,在我的MinGW编译的C代码中?

是的,您使用的库与您的平台兼容非常重要。通常Unix库不会在Windows上运行,反之亦然,如果你使用的是JAVA,你最好使用.jar文件通常可以在任何启用了JAVA的平台上运行(虽然版本很重要)

要使用其他库,首选方式是什么? LoadLibrary()或#include<>?

include不是一种使用库的方法,它只是一个预处理器指令,告诉您预处理器在当前源文件中包含外部源文件。这个文件可以是任何文件,不仅仅是.h,尽管它通常是.h或.hpp 除非您确定在特定时间加载库将为您的代码添加一些值,否则您最好还是决定何时将库加载到运行时环境或链接器。执行此操作的性能成本和确切方法取决于平台。

有些库只提供源代码或.dll - 如何使用这些库?每次重建项目时都必须重新编译它们吗?

如果您有源代码,则每次对其进行更改时都需要重新编译它。 但是,如果您还没有更改库的源代码,则无需重新编译它。像Make这样的构建工具非常聪明,可以为您做出这个决定。

如何创建一个大的.exe?这被称为“静态链接”吗?

创建静态.exe取决于您使用的构建工具。 使用gcc这通常意味着你必须使用-static选项 gcc -static -o my.exe my.c

如何将一些随机文件包含到.exe中?说一个节目图标或启动歌曲?

编程中没有任何内容是随机的。如果是的话我们会遇到麻烦。您再次播放歌曲或显示图标的方式取决于您在某些平台上使用的平台,甚至可能无法这样做。

如何将我的巨大.c拆分成较小的?我是否需要为每个部分创建一个头文件,然后我将其包含在WinMain()或main()部分中?

您需要一个包含所有函数原型的头文件,并且可以将程序拆分为包含一个或多个函数的多个.c文件。您的主文件将包含头文件。所有源文件都需要单独编译,然后链接到一个可执行文件中。通常你会为每个.c获得一个.o然后你将所有.o链接在一起以获得.exe

如果有一个库需要另一个库,是否可以将这两个文件组合成一个文件?比方说,python26.dll需要msvcr90.dll和Microsoft.VC90.CRT.manifest

是的,一个图书馆可能需要另一个图书馆,但不建议将不同的图书馆打包在一起,您可能违反了知识产权,也因为每个图书馆通常是一个具有特定目的的明确定义的单位,并且通常将它们合并为一个没有多大意义。

如果我不释放以前分配的内存会怎样?如果程序(进程)死了,这会被清理吗?

再次取决于平台,通常在大多数操作系统上,内存将在程序死后恢复,但在某些平台上,如嵌入式系统,它可能会永久丢失。 清理程序使用的资源总是一个好主意。

答案 2 :(得分:0)

严肃地说,学习如何运行本地环境的地方是当地环境的文档。毕竟我们甚至都不知道你的环境是什么,更不用说在我们面前了。

但是这里有一些答案:

1.您需要标题和某种可链接对象。或者您需要源代码以便构建它们。

3.重要的是库的格式是您的链接器可以理解的。在c ++和其他语言中,它还需要理解使用的名称修改。

6.强制所有库代码都包含在可执行文件中,实际上称为“静态链接”。

7.at least one StackOverflow question on "resource compilers"