如何加载my.dll中的int add(int, int)函数呢?
HMODULE hModule = LoadLibrary("xxx.dll");
然后将int add(int, int)函数的名称前面加一个*表示函数指针变量;
变为:int (* add)(int, int);
然后将该函数指针变量赋值:int (* add)(int, int) = GetProcAddress(hModule,"add");
但是GetProcAddress返回值是void *,需要强制转换一下即可;
int (* add)(int, int) = (int (*)(int, int))GetProcAddress(hModule,"add");
完毕。
知识点:将一个函数的名称前面加上*,然后括号括起来,表示函数指针变量。
如果此时再去掉函数名称,则表示函数指针。
GNU Make是一个工具,这个工具控制着一个程序的可执行文件和其他非源文件的生成,这些文件来源于程序的源文件。
Make 通过一个叫做makefile的文件作为指导,才能指导如何去编译你的程序。这个makefile文件列出了每一个非
源文件,也指出了如何从其他文件中来编译这个文件。当你编写一个程序的时候,你应该为它编写一个makefile,
在此基础上才可能使用make命令去编译和安装这个程序。
-
Make使得终端用户可以编译和安装你的程序包,而不需要知道它是如何完成的细节--因为这些细节已经记录在你所提供的makefile中了
-
Make自动理解它需要更新哪个文件,基于哪个源文件已经改变了。
它也自动决定更新文件的正确顺序,以防止一个非源文件依赖于另一个非源文件。
结果,如果你改变了一些源文件并且执行Make命令,它不需要重新编译你的程序的所有文件。
它只更新直接或间接依赖于你所改变的源文件的这些非源文件。
-
Make不局限于某一个种特定语言。对于每一个非源文件,makefile指定脚本命令去计算它。
这些脚本命令可以运行一个编译器去产生一个目标文件,并且可以运行一个连接器去产生一个可执行文件,
去更新一个库或者TeX或者是格式化文档的信息。
-
Make不局限于组建一个包。你也可以使用Make去控制安装或者卸载一个包,为这个包产生标记表,或者
其他的任何你想做的事情。当你写好如何去做,Make经常足够有效的。
GNU Make与其他许多Make版本相比,makefiles中有很多可供使用的强大的功能。
它可以再生,使用,然后删除不需要保存的中间文件。
GNU Make也有一些简单但是非常方便的特性。比如,-o file选项表示假设源文件没有改变,即使它已经改变了。
当你增加一个新的宏定义到一个头文件中这是非常有用的。在你知道你对头文件的改变不需要重新编译的情况下,
GNU Make给了你一个方法去避免重新编译。
当然,GNU Make和其他版本的Make的最大区别在于GNU Make是免费软件。
我们已经发展了如何写Makefiles的约定,这些约定所有的GNU包都应该遵守。
即使你不打算成为GNU软件,在你的程序中遵守这些约定也是一个极好的注意,
这样的话用户可以能够像其他的包一样进行组件你的包,并且在此之前不需要学习任何特殊的知识。
make工具自动决定一个大型程序的哪个部分需要被编译,并且调用命令去重新编译它们。
这个手册描述了被Richard Stallman和Roland McGrath实现的GNU make。
自从3.76版本之后的开发由Paul D.Smith接手。
GNU make遵守IEEE标准的6.2部分。
我们的例子展示了C程序,因为它是最普通的,但是你可以用任何编程语言使用make,
只要这个编程语言可以被一个shell命令运行。
事实上,make不局限于任何程序。你可以使用make去描述任何任务,
在这些任务中,当其他文件更新之后,一些依赖于此的其他文件必须被自动更新。
为了准备好使用make,你必须写一个叫做makefile的文件,这个makefile描述了各个程序文件
之间的关系,并且提供更新每个文件的命令。
在一个程序中,典型地,可执行文件从目标文件中更新,而目标文件是有编译源文件产生的。
一旦一个合适的makefile存在,每次你更新一些源文件之后,使用一个简单的shell命令:make
这样就足够执行所有必须的从新编译工作。
make程序使用makefile数据库以及文件的最后一次编译时间去决定哪个文件需要被更新。
这些文件中的每一个,make都会将其记录到数据库中。
你可以给make提供命令行参数去控制哪个文件应该被重新编译,或者如何编译。
参见第9章如何运行make章节
如果你对make是个新手,或者想要寻找一个通用介绍,读每个章节的前几个部分,跳过后面的部分。
在每个章节中,前几个部分包含介绍或者通用信息,后面的部分包含专业信息以及技术信息。
第二章和第三章是例外,整个章节都是介绍。
为了一个快速总结,参看9.7部分,附录A以及4.8部分。
如果你有关于GNU make的问题或者你认为你发现了一个bug,请将此反馈给开发人员。
我们不能承诺任何事情,但是我们希望会很好地解决它。
在报告bug之前,要确保你发现了一个真正的bug。仔细地重新读一遍说明文档,看看是否
它真的说了你可以做你正在尝试的动作。如果它没有清晰地描述你是否能够做这些事情,
也应该报告这个问题,这就是一个文档bug。
在报告一个bug或者你自己尝试解决它之前,尝试一下将这个bug隔离到尽可能最小化的makefile中,
然后复现这个bug。然后向我们发送这个makefile,以及make命令给你的确切结果,包括
任何错误或者警告信息。情不好改述这些消息:最好是剪切然后复制到你的报告中。
当生成这个小的makefile时,确保不要在你的方法中使用任何非免费或者不常见的工具。
你几乎总能够找到简单的shell命令来模仿这样的一个工具。这样可以帮助我们判断
这个问题是否真的已经在文档中。
一旦你有了一个精确的问题,你可以通过一下两种方式报告它。发送电子邮件到[email protected]
或者使用我们的网站工程管理工具:http://savannah.gnu.org/projects/make/
除了以上信息,请仔细地将你正在使用的make版本号包含到报告中。
你可以使用命令make -version获取关于版本的信息。
确保也将你的机器类型和你正在使用的操作系统包含在你的报告中。
包含这个信息的一种方法是通过命令make -make命令产生的信息的最后一行得出。
你需要一个叫做makefile的文件去告诉make如何去做。最经常的,makefile告诉make如何编译和连接一个程序。
在这个章节中,我们将会套路一个简单的makefile,这个makefile描述了如何编译和连接一个文本编辑软件,
这个编辑软件由8个C源文件和3个头文件组成。
makefile也可以显示地要求去告诉make如何运行各种各样的命令(例如,当一个清空操作时去除特定文件)。
要看一个更加复杂的makefile的例子,参见附录C。
当make重新编译这个编辑器,每一个改变了的C源文件都必须被重新编译。
如果一个头文件改变了,为了安全起见,那么每一个包含了该头文件的源文件都必须被重新编译。
每一次的编译产生一个与源文件对应的目标文件。
最后,如果任意源文件已经被重新编译,那么所有的目标文件,不管该目标文件是新的还是旧的,
都必须被链接在一起产生一个新的可执行的编辑器。
一个简单的makefile由如下的形式的规则组成:
target...:prerequisites... recipe ... ...
target通常是程序生成的文件的名称。例如target一般是可执行文件或者目标文件。
一个target也可以是要执行的动作的名称,例如clean.
一个prerequisite是一个文件,这个文件是用来作为创建target的输入。