• 手动编译和链接 程序


    现在每天的开发都是使用vs 2005, 这个IDE为我们做了很多的事情,包括项目文件的管理和编译生成可执行文件等。为了对其背后的原理做一下了解,我用手动的方式来编写和生成简单的dll和exe,希望能对整个流程有个了解。

    创建一个dll文件

    先是dll文件部分,我定义了一个头文件和2个cpp文件,分别的代码如下

    //mydll.h

    #ifndef MyDllAPIHeader
    #define MyDllAPIHeader

    #ifdef MyDllAPI
    #else
    #define MyDllAPI extern "C" _declspec(dllimport)
    #endif

    MyDllAPI
    int add(int a, int b);
    MyDllAPI
    int minus(int a, int b);

    #endif
    //mydll.cpp
    #define MyDllAPI extern "C" _declspec(dllexport)
    #include
    "mydll.h"

    int add(int a, int b)
    {
    return a+b;
    }
    //mydllFuncs.cpp
    #define MyDllAPI extern "C" _declspec(dllexport)
    #include
    "mydll.h"

    int minus(int a, int b)
    {
    return a-b;
    }

    通过输入cl命令来编译一下

    cl /c mydll.cpp mydllfuncs.cp

    这时会生成这两个文件的obj文件,然后采用下面的命令链接成.dll文件

    link mydll.obj mydllfuncs.obj /dll /out:ko.dll

    其中/dll用来说明要链接一个dll文件,而/out可以用来指定生成的文件名。执行后,生成ko.dll, ko.exp, ko.lib 三个文件。

    通过dumpbin查看dll的导出信息如下:

    E:\myproj\VC\DLL>dumpbin -exports ko.dll
    Microsoft (R) COFF/PE Dumper Version
    8.00.50727.762
    Copyright (C) Microsoft Corporation. All rights reserved.


    Dump of file ko.dll

    File
    Type: DLL

    Section contains the following exports for ko.dll

    00000000 characteristics
    4E2A5131 time date stamp Sat Jul
    23 12:42:25 2011
    0.00 version
    1 ordinal base
    2 number of functions
    2 number of names

    ordinal hint RVA name

    1 0 00001000 add
    2 1 00001010 minus

    Summary

    2000 .data
    2000 .rdata
    1000 .reloc
    7000 .text

    创建调用dll的一个exe文件

    定义的可执行的程序代码如下

    #include "mydll.h"
    #include
    <stdio.h>

    int main()
    {
    printf(
    "%d\n", add(2, 3));
    printf(
    "%d\n", minus(3,2));
    }

    编译的命令如下:

    cl myexe.cpp /link ko.lib

    此时就会生成myexe.exe文件

  • 相关阅读:
    OSI 和 TCP/IP 网络分层
    java 类加载器
    操作系统 内存管理
    基础线程机制
    java 互斥同步
    数据库引擎
    java 内存分配与回收策略
    Redis基础
    二进制
    node版本管理nvm科学用法
  • 原文地址:https://www.cnblogs.com/kwliu/p/2114746.html
Copyright © 2020-2023  润新知