精华内容
下载资源
问答
  • 动态库、可执行文件符号表分析

    千次阅读 2020-04-20 12:21:19
    再编写一个实现main函数的C文件,分别调用上述第一步动态库中的函数; 分析最后的可执行文件动态库文件的符号表; 1.1 第一个C文件:basic.c 这个C文件只定义并实现了四个不同形参的函数、五个静态变量、一个...

    动态库内容分析

    1. 动态库编译

    基本思路为:

    • 先编写两个C文件,其中各自实现几个函数,变量,然后将其分别编译为动态库;
    • 再编写一个实现main函数的C文件,分别调用上述第一步动态库中的函数;
    • 分析最后的可执行文件和动态库文件的符号表;

    1.1 第一个C文件:basic.c

    这个C文件只定义并实现了四个不同形参的函数、五个静态变量、一个全局变量。由于只关心符号表或者其他二进制内容,因此不具体实现特定功能。

    /*************************************************************************
                 > File Name: basic.c
                 > Author: Toney Sun
                 > Mail: vip_13031075266@163.com
           > Created Time: 2020年04月20日 星期一 09时50分51秒
     ************************************************************************/
    
    #include<stdio.h>
    
    int basic_func=4;
    static char *Author="Toney Sun";
    
    void func1()
    {
    	int tmp_var;
    	static char *Mail="vip_13031075266@163.com";
    }
    void func2(int x)
    {
    	static char *Mail="vip_13031075266@163.com";
    }
    int func3(char *a)
    {
    	static char *Mail="vip_13031075266@163.com";
    }
    char * func4(int x, int y)
    {
    	static char *Mail="vip_13031075266@163.com";
    }
    
    
    
    
    
    

    1.2第二个C文件:demo.c

    ​ 在demo.c中我定义一个结构体udphdr。然后分别定义了两个全局变量,实现了三个函数:func5, func6, fun7。

    /*************************************************************************
                 > File Name: demo.c
                 > Author: Toney Sun
                 > Mail: vip_13031075266@163.com
           > Created Time: 2020年04月19日 星期日 22时33分39秒
     ************************************************************************/
    
    #include<stdio.h>
    
    struct udphdr{
    	short dstport;
    	short srcport;
    	short checksum;
    	short length;
    };
    enum Date{
    	Monday,
    	Tuesday,
    	Wensday,
    	Thursday,
    	Friday,
    	Saturday,
    	Sunday,
    };
    struct udphdr udp1;
    
    enum Date today = Monday;
    
    int iphdr1=10;
    
    extern void func1();
    extern void func2(int x);
    extern int func3(char *);
    extern char * func4(int x, int y);
    
    int fun5(int a)
    {
    	struct udphdr udp2;
    	func1();
    	printf("aaaaaaaaaaa\n");
    }
        
    int fun6(char *a)
    {
    	static struct udphdr udp1;
    	func2(10);
    	printf("aaaaaaaaaaa\n");
    }
    int fun7(int a, char *b)
    {
    	func3("test");
    	printf("aaaaaaaaaaa\n");
    }
    
    

    1.3第三个C文件:main.c

    ​ main.c主要用来实现main函数,并调用其他C文件中实现的函数和全局变量。从而观察对比不同的函数、变量在符号表中的异同。

    /*************************************************************************
                 > File Name: main.c
                 > Author: Toney Sun
                 > Mail: vip_13031075266@163.com
           > Created Time: 2020年04月20日 星期一 09时44分38秒
     ************************************************************************/
    
    #include<stdio.h>
    extern void func1();
    extern int fun5(int a);   
    extern int fun6(char *a);
    extern int fun7(int a, char *b);
    
    extern struct udphdr udp;
    extern int iphdr;
    
    int myAge=25;
    char *mail="vip_13031075266@163.com";
    
    int show()
    {
    	printf("Author: Toney Sun\n");
    }
    
    int main(int argc, char **argv)
    {
    	int a=10;
    	int b=11;
    	fun5(a);
    	fun6("aaaaa");
    	fun7(a, "Toney Sun");
    	show();
    	
    	udp.srcport=4500;
    	iphdr=10;
    	return 0;
    }
    

    2.动态库编译

    • 使用gcc工具将basic.c编译为libbasic.so;

    • 使用gcc工具将demo.c编译为libdemo.so

    • 使用gcc工具将main.c链接上述两个动态库后编译为a.out

      **注意:**我们不是为了执行该a.out, 而是想查看上述三个二进制文件的内容(符号表)。

    toney@ubantu$ gcc -shared -fpic -o libdemo.so demo.c 
    toney@ubantu$ gcc -shared -fpic -o libbasic.so basic.c 
    toney@ubantu$ gcc main.c -L./ -ldemo -lbasic
    toney@ubantu$ ls -l
    total 35
    -rwxrwxrwx 1 root root 8552 4月  20 10:18 a.out
    -rwxrwxrwx 1 root root  454 4月  20 09:52 basic.c
    -rwxrwxrwx 1 root root  763 4月  20 09:49 demo.c
    -rwxrwxrwx 1 root root 8016 4月  20 09:43 demo.so
    -rwxrwxrwx 1 root root 7528 4月  20 10:17 libbasic.so
    -rwxrwxrwx 1 root root 8128 4月  20 10:17 libdemo.so
    -rwxrwxrwx 1 root root  846 4月  20 10:18 main.c
    

    链接怎么还有个顺序问题:(

    toney@ubantu$ gcc main.c -L./ -lbasic -ldemo
    .//libdemo.so: undefined reference to `func3'
    .//libdemo.so: undefined reference to `func1'
    .//libdemo.so: undefined reference to `func2'
    collect2: error: ld returned 1 exit status
    toney@ubantu$ gcc main.c -L./ -ldemo -lbasic
    toney@ubantu$
    

    3.二进制内容分析

    3.1 libbasic.so分析

    3.1.1 basic.c内容汇总
    序号 函数或变量 性质
    1 void func1() 自定义函数
    2 void func2(int x) 自定义函数
    3 int func3(char *a) 自定义函数
    4 char * func4(int x, int y) 自定义函数
    5 int basic_func; 自定义全局变量
    6 static char *Author; 自定义全局静态变量
    7 static char *Mail; func1内定义局部静态变量
    8 static char *Mail; func2内定义局部静态变量
    9 static char *Mail; func3内定义局部静态变量
    10 static char *Mail; func4内定义局部静态变量
    3.1.2 libbasic.so符号表
    • 使用nm工具查看符号表内容(当然也可以使用其他工具查看,例如objdump, readelf, ldd等):
    toney@ubantu$ nm libbasic.so 
    0000000000201028 d Author		==================全局静态变量=================
    0000000000201020 D basic_func	====================全局变量==================
    0000000000201050 B __bss_start
    0000000000201050 b completed.7698
                     w __cxa_finalize
    00000000000005a0 t deregister_tm_clones
    0000000000000630 t __do_global_dtors_aux
    0000000000200e88 t __do_global_dtors_aux_fini_array_entry
    0000000000201018 d __dso_handle
    0000000000200e90 d _DYNAMIC
    0000000000201050 D _edata
    0000000000201058 B _end
    00000000000006a4 T _fini
    0000000000000670 t frame_dummy
    0000000000200e80 t __frame_dummy_init_array_entry
    00000000000007e8 r __FRAME_END__
    000000000000067a T func1		===================实现函数===================
    0000000000000681 T func2		===================实现函数===================
    000000000000068b T func3		===================实现函数===================
    0000000000000696 T func4		===================实现函数===================
    0000000000201000 d _GLOBAL_OFFSET_TABLE_
                     w __gmon_start__
    00000000000006d0 r __GNU_EH_FRAME_HDR
    0000000000000568 T _init
                     w _ITM_deregisterTMCloneTable
                     w _ITM_registerTMCloneTable
    0000000000201030 d Mail.2252	================局部静态变量===================
    0000000000201038 d Mail.2256	================局部静态变量===================
    0000000000201040 d Mail.2260	================局部静态变量===================
    0000000000201048 d Mail.2265	================局部静态变量===================
    00000000000005e0 t register_tm_clones
    0000000000201050 d __TMC_END__
    
    
    • 使用nm -Da 查看本动态库定义的内容信息
    toney@ubantu$ nm -Da libbasic.so 
    0000000000201020 D basic_func		----------------1----------------
    0000000000201050 B __bss_start
                     w __cxa_finalize
    0000000000201050 D _edata
    0000000000201058 B _end
    00000000000006a4 T _fini
    000000000000067a T func1			----------------2----------------
    0000000000000681 T func2			----------------3----------------
    000000000000068b T func3			----------------4----------------
    0000000000000696 T func4			----------------5----------------
                     w __gmon_start__
    0000000000000568 T _init
                     w _ITM_deregisterTMCloneTable
                     w _ITM_registerTMCloneTable
    
    
    3.1.3 小结
    • 本文件内定义的全局变量用‘D’来表示;
    • 本文件内定义的全局静态变量用‘d’来表示;
    • 本文件内实现的函数用‘T’来表示;
    • 不同函数内定义的静态变量在符号表中的符号有所差别,因此不会出现混淆的问题
    • 从上述内容可以猜测:使用‘d’表示的变量不能被其他文件引用(上述‘d’标识的都是静态变量,这也比较合理)

    3.2 libdemo.so分析

    3.2.1 demo.c内容汇总
    序号 函数或变量 性质
    1 struct udphdr udp1; 自定义的全局结构体变量
    2 static struct udphdr udp2; 自定义全局静态变量
    3 struct udphdr udp2; 自定义局部变量
    4 enum Date today 自定义全局枚举变量
    5 int iphdr; 自定义全局变量
    6 extern void func1(); 外部函数
    7 extern void func2(int x); 外部函数
    8 extern int func3(char *); 外部函数
    9 extern char * func4(int x, int y); 外部函数
    10 int fun5(int a) 自定义函数
    11 int fun6(char *a) 自定义函数
    12 int fun7(int a, char *b) 自定义函数
    3.2.2 demo.so符号表

    同样的,我们使用nm工具来查看动态库符号表信息:

    toney@ubantu$ nm libdemo.so 
    0000000000201044 B __bss_start
    0000000000201048 b completed.7698
                     w __cxa_finalize@@GLIBC_2.2.5
    00000000000006b0 t deregister_tm_clones
    0000000000000740 t __do_global_dtors_aux
    0000000000200e18 t __do_global_dtors_aux_fini_array_entry
    0000000000201038 d __dso_handle
    0000000000200e20 d _DYNAMIC
    0000000000201044 D _edata
    0000000000201068 B _end
    0000000000000800 T _fini
    0000000000000780 t frame_dummy
    0000000000200e10 t __frame_dummy_init_array_entry
    0000000000000908 r __FRAME_END__
    000000000000078a T fun5							=============================
    00000000000007ae T fun6							=============================
    00000000000007d3 T fun7							=============================	
                     U func1						=============================
                     U func2						=============================
                     U func3						=============================
    0000000000201000 d _GLOBAL_OFFSET_TABLE_
                     w __gmon_start__
    000000000000081c r __GNU_EH_FRAME_HDR
    0000000000000638 T _init
    0000000000201040 D iphdr1						=============================
                     w _ITM_deregisterTMCloneTable
                     w _ITM_registerTMCloneTable
                     U puts@@GLIBC_2.2.5
    00000000000006f0 t register_tm_clones
    0000000000201048 d __TMC_END__
    0000000000201050 B today						=============================
    0000000000201060 B udp1							=============================
    0000000000201058 b udp1.2278					=============================
    
    3.2.3 小结
    • 结构体变量(非基本型变量)使用‘B’或‘b’来标识。
      • 全局结构体变量使用‘B’标识
      • 局部静态结构体变量使用‘b’标识
      • 局部变量不会显示在符号表中
    • 本文件内使用的函数使用‘T’标识
    • 引用其他文件的函数使用‘U’标识

    3.3 可执行文件a.out分析

    3.3.1 main.c内容汇总
    序号 函数或变量 性质
    1 extern void func1(); 引用外部函数
    2 extern int fun5(int a); 引用外部函数
    3 extern int fun6(char *a); 引用外部函数
    4 extern int fun7(int a, char *b); 引用外部函数
    5 extern struct udphdr udp1; 引用外部结构体变量
    6 extern int iphdr1; 引用外部基本类型变量
    7 int myAge=25; 本地全局变量
    8 char *mail=“vip_13031075266@163.com”; 本地全局静态变量
    3.3.2 a.out符号表

    同样使用nm工具进行查看:

    toney@ubantu$ nm a.out 
    0000000000201020 B __bss_start
    0000000000201030 b completed.7698
                     w __cxa_finalize@@GLIBC_2.2.5
    0000000000201000 D __data_start
    0000000000201000 W data_start
    00000000000007a0 t deregister_tm_clones
    0000000000000830 t __do_global_dtors_aux
    0000000000200d88 t __do_global_dtors_aux_fini_array_entry
    0000000000201008 D __dso_handle
    0000000000200d90 d _DYNAMIC
    0000000000201020 D _edata
    0000000000201038 B _end
    0000000000000974 T _fini
    0000000000000870 t frame_dummy
    0000000000200d80 t __frame_dummy_init_array_entry
    0000000000000b2c r __FRAME_END__
                     U fun5					============1==============
                     U fun6					============2==============
                     U fun7					============3==============
    0000000000200fa0 d _GLOBAL_OFFSET_TABLE_
                     w __gmon_start__
    00000000000009c0 r __GNU_EH_FRAME_HDR
    00000000000006f8 T _init
    0000000000200d88 t __init_array_end
    0000000000200d80 t __init_array_start
    0000000000000980 R _IO_stdin_used
    0000000000201020 B iphdr1				============4=============
                     w _ITM_deregisterTMCloneTable
                     w _ITM_registerTMCloneTable
    0000000000000970 T __libc_csu_fini
    0000000000000900 T __libc_csu_init
                     U __libc_start_main@@GLIBC_2.2.5
    0000000000201018 d mail					============5==============
    000000000000088d T main					============6==============
    0000000000201010 D myAge				============7==============
                     U puts@@GLIBC_2.2.5
    00000000000007e0 t register_tm_clones
    000000000000087a T show					============8==============
    0000000000000770 T _start
    0000000000201020 D __TMC_END__
    0000000000201028 B udp1					============9==============
    
    
    3.3.3 小结
    • 引用的外部函数使用‘U’来标识
    • 全局变量使用‘D’来标识
    • 全局静态变量使用‘d’来标识
    • 引用的外部全局变量(简单类型和复杂类型)使用‘B’来标识

    4.总结

    对符号表中常见的变量、函数标识总结如下:

    序号 标识 说明
    1 T 自定义函数(本文件内)
    2 t 尚未分析
    3 D 自定义标准类型全局变量(如int, char, float等)
    4 d 自定义标准类型静态变量(包括全局静态变量、局部静态变量)
    5 B 自定义扩展类型全局变量(如结构体类型,枚举型等)、引用的外部全局变量
    6 b 自定义静态扩展类型变量(包括全局静态、局部静态类型变量)
    7 U 引用的外部函数
    8 局部变量在符号表中是不存在的。
    展开全文
  • so 动态库文件和静态库文件区别 在Linux操作系统,普遍使用ELF格式作为可执行程序或者程序生成过程的中间格式。ELF(Executable and Linking Format,可执行连接格式)。 ELF文件分类 ELF文件格式包括三种主要...

    so 动态库文件和静态库文件区别

    在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)。

    ELF文件分类

    ELF文件格式包括三种主要的类型:可执行文件、可重定向文件、共享库:
    1、可执行文件(应用程序)
    可执行文件包含了代码和数据,是可以直接运行的程序。
    2、可重定向文件(.o)
    可重定向文件又称为目标文件,它包含了代码和数据(这些数据是和其他重定位文件和共享的object文件一起连接时使用的)。
    .o文件参与程序的连接(创建一个程序)和程序的执行(运行一个程序),它提供了一个方便有效的方法来用并行的视角看待文件的内容,这些*.o文件的活动可以反映出不同的需要。
    Linux下,我们可以用gcc -c编译源文件时可将其编译成*.o格式。
    3、共享文件(*.so)
    也称为动态库文件,它包含了代码和数据(这些数据是在连接时候被连接器ld和运行时动态连接器使用的)。动态连接器可能称为ld.so.1,libc.so.1或者 ld-linux.so.1。

    动态链接库和静态链接库的区别

    动态链接库就像是python 中的库一样,但是事程序实时调用的二进制文件,静态链接库就像是一个不可移动的库文件,很多的数据都能在其中找到,因此叫做静态数据库。

    静态库

    生成xxx.o文件

    gcc -c xxx.c
    

    将.o文件转化成.a ,利用ar命令,生成xxx.a的静态文件

    ar crs xxx.a xxx.o
    

    so.PNG
    生成了静态的库文件,同时可以将多个二进制的文件进行组装到一个静态库中。
    同时可以使用ar -t 来查看静态库中拥有哪些obj文件
    然后我们可以使用

    gcc -o xxx xxx.c -L, -xxx
    

    -L 表示当前文件夹下面,xxx代表了刚才生成的静态库文件名称。

    动态库

    动态库是程序运行时加载的库,只有在动态链接正确安装之后,所有的程序就可以使用动态库来运行程序,动态库是目标文件的集和,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对的,每次调用都有可能产生新的地址,可以利用puts等函数来读出地址,进行漏洞调用。
    利用.o文件创建动态链接库:

    fs@ubuntu:~/qiang/lib/dylib$ gcc -fPIC -Wall -c dy1.c dy2.c
    fs@ubuntu:~/qiang/lib/dylib$ gcc -shared -o libtest.so dy1.o dy2.o
    fs@ubuntu:~/qiang/lib/dylib$ 
    

    这里的 -fPIC 指创建与地址无关的编译程序, -share 生成动态链接库。
    下面我们就能够使用动态链接:

    fs@ubuntu:~/qiang/lib/dylib$ gcc -o test main.c -L. -ltest
    fs@ubuntu:~/qiang/lib/dylib$ ls
    dy1.c  dy2.c  libtest.so  main.c  mylib.h  test
    

    这里的l 是动态库的调用规则,因为linux系统的动态库命名方式是lib*.so 所以这里*代表了自己的库名。
    直到这里我们依然无法利用动态链接库来进行程序运行,因为程序没有找到动态链接库,这里有三种解决方法,
    1.将动态链接库放到 /usr/lib/以及/lib目录下

    cp libtest.so  /lib
    

    详细链接

    展开全文
  • 编译A时B提示:无法打开包括文件,QSqlDatabase(此时B单独编译没问题)。 解决方案: 1、查看报错文件属于QSql目录,选中A工程点击VS工具栏上的Qt5插件-->Qt Project Settings; 2、选择Qt Modules分页面,选中...

    Qt动态库A引用动态库B,

    编译A时B提示:无法打开包括文件,QSqlDatabase(此时B单独编译没问题)。


    解决方案:

    1、查看报错文件属于QSql目录,选中A工程点击VS工具栏上的Qt5插件-->Qt Project Settings;

    2、选择Qt Modules分页面,选中SQL选项;

    3、重新编译 动态库A,此时应该可以成功编译。


    遇到相同问题可以尝试使用这种方法,但不保证一定可以解决问题。

    展开全文
  • QT Creator调用动态库文件例程

    千次阅读 2014-04-15 08:58:59
    在linux,qt里面已经集成了最新的开发平台QT Creator,下面是我练习调用动态库(.so文件)的例程:  1、打开QT Creator,点击File-》New...菜单,选择C++ Libarary工程,点击下一步,输入工程名称(本例为zsz)...

    linux中,qt里面已经集成了最新的开发平台QT Creator,下面是我练习调用动态库(.so文件)的例程:

      1、打开QT Creator,点击File-》New...菜单,选择C++ Libarary工程,点击下一步,输入工程名称(本例为zsz)即可,这没什么可说的。

      工程文件(.pro)程序清单

      # -------------------------------------------------

      # Project created by QtCreator 2009-03-02T10:09:35

      # -------------------------------------------------

      TARGET = zsz

      TEMPLATE = lib

      CONFIG += plugin

      DEPENDPATH += .

      INCLUDEPATH += .

      SOURCES += mylib.cpp

      HEADERS += mylib.h

      mylib.h文件程序清单:

      #ifndef MYLIB_H

      #define MYLIB_H

      #ifdef Q_WS_WIN //表示在windows环境

      #define MY_EXPORT __declspec(dllexport)

      #else

      #define MY_EXPORT

      #endif

      class mylib {

      public:

      int mymax(int i, int j);

      int add(int i, int j);

      };

      extern "C" MY_EXPORT int diff(int i, int j);

      #endif // MYLIB_H

      mylib.cpp文件程序清单:

      #include "mylib.h"

      extern "C" MY_EXPORT int mylib::mymax(int i,int j)

      {

      if(i>=j)

      return i;

      else

      return j;

      }

      extern "C" MY_EXPORT int mylib::add(int i,int j)

      {

      return i+j;

      }

      extern "C" MY_EXPORT int diff(int i, int j)

      {

      if(i>=j)

      return i-j;

      else

      return j-i;

      }

      对该工程进行编译,生成libzsz.so文件。

      2、创建一个GUI工程,并把zsz工程下的mylib.h和libzsz.so两个文件拷贝到当前目录下。

      工程文件程序清单:

      # -------------------------------------------------

      # Project created by QtCreator 2009-03-02T10:15:03

      # -------------------------------------------------

      TARGET =

      TEMPLATE = app

      QT += svg

      DEPENDPATH += .

      INCLUDEPATH += .

      LIBS += ./libzsz.so

      SOURCES += main.cpp

      HEADERS += mylib.h

      main.cpp中的程序为:

      #include <qapplication.h>

      #include <QPushButton>

      #include <QLibrary>

      #include <QtDebug>

      #include "mylib.h"

      int main(int argc, char *argv[])

      {

      QApplication app(argc, argv);

      QPushButton hello("Hello world!zwd");

      hello.resize(400, 200);

      mylib a;

      qDebug()<<"In the two numbers 9 and 15,maxxer is "<< a.mymax(15,9);

      qDebug()<<"Add the two numbers 9 and 15,result is "<< a.add(15,9);

      qDebug()<<"Diff the two numbers 9 and 15,result is "<< diff(15,9);

      hello.show();

      return app.exec();

      }

    展开全文
  • windows的动态库:xxx.dll2.3. linux的动态库:libxxx.so2.4. linux的静态库:xxx.a三. 自己编译库3.1 编译产生windows的静态库3.1.1代码准备:3.1.2 static_lib.cpp:3.1.3 static_lib.h:3.2 编译...
  • makefile生成动态库和静态库文件

    千次阅读 2018-01-08 18:27:20
    编写程序实现两个整数相加、相减操作 1、文件分布(xiangjian....3、将相加功能和相减功能生成静态库(.a)和动态库(.so) 此时我的makefile文件内容为: all:math libmymath1.a libmymath2.so math:main
  •  一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接 dynamic link library。  一种是LIB包含函数代码本身,在编译时直接将代码加入程序...
  • 创建和使用动态库 使用def文件

    万次阅读 2017-08-01 08:53:34
    这个是vs2013自动生成的,但是你在建立项目的时候,选择了空项目,所以就没有,如果没选择空项目就会有这个文件,但是他会包含很多的其他的依赖文件,这里都去除了,我们是要生成一个纯净的动态库, // dl
  • 在linux系统下,当系统存在多个相同命名的动态库(.so)时,ldconfig只为执行程序链接最后找到的库,而之后找到的库虽然通过“ifconfig -p”可以看到库路径信息,但不会被链接到执行程序。   在实际编程,...
  • VS2010 编写动态库和调用动态库

    千次阅读 2018-11-12 23:05:42
    ... VS2010 编写动态库和调用动态库 百度查了一下在VS编写动态库的方法,亲测有效。 (1)启动VS2010》文件》新建》项目,按下图进行选择填写,选择Win32控制台应...
  • gcc MakeFile文件引用静态库与动态库的区别makefile文件引用库路径,如下: LIB_PATH += -L路径 makefile文件引用静态库/动态库,如下: LIBS += -l库 (这的库是去掉lib,.a, .so剩余部分,如libaaa.so 这写...
  •  在VC编程常常碰到的.lib文件有一个需要注意的地方是: 静态库——函数和数据被编译进一个二进制文件(扩展名问.lib)。在使用静态库的情况下,在编译连接可...动态库——在使用动态库时,往往提供两个文件
  • 在使用静态的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.EXE文件)。当发布产品时,只需要发布这个可执行文件,并不需要发布被...
  • java调用dll动态库文件的一般总结

    万次阅读 2017-02-17 10:46:21
    前一段时间,在项目需求,需要调用一下第三方的动态库文件,下面是本人一些尝试的经历。  首先需要明白的是,在java是不能直接调用动态库文件的,因为动态库文件是使用c或是c++编写的,作为一种跨 平台的编程...
  • 在VC编程常常碰到的.lib文件有一个需要注意的地方是:   静态库——函数和数据...   动态库——在使用动态库时,往往提供两个文件:一个引入库(.lib)文件和一个DLL(.dll)文件。虽然引入
  • 动态库文件dll生成lib库文件

    万次阅读 2014-06-18 11:02:55
    本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件。 参考OpenBlas的说明“Howto generate import library for MingW”,和MinGW的说明HOWTO Create an ImportLibrary for a DLL using MinGW,...
  • CMake教程(一)- 添加库文件什么是库文件如何在CMake添加库文件 什么是库文件 如何在CMake添加库文件
  •  还有其他文件 比如动态库(.so) 目标文件(.o) 答5: 在Linux 下经常需要链接一些 *.a的库文件,那怎么查看这些*.a 包 含哪些文件、函数、变量:  1. 查看文件:ar -t *.a  2. 查看函数、变量:nm ...
  • 本文的目的是测试各种类型的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。 太长不看版:请跳至文章最后的总结对比表。 一。内容包含: ①静态libbb.a依赖静态libaa.a的测试; ②...
  • C/C++ 生成动态库文件(dll)

    千次阅读 2019-02-28 15:20:20
    功能模块的入口函数是指你开发的程序的对外的接口,也就是说生成动态库后,其他程序通过这个接口函数来使用你开发的功能。 1. 入口函数在声明时要加上“__declspec(dllexport)”,表明这是一个...
  • 近期正在做在Ubuntu环境下将C++程序封装成动态库文件和静态库文件,期间不知道掉了多少坑,在这里写下来以免忘记工作是将实现MTCNN的C++源代码封装成动态库文件和静态库文件,原先在github上找到了一个依据opencv和...
  • 然后想引用到另一个项目b去,这个项目如果设置同样生成静态库,就正常编译后生成b.lib,但是我需要的是动态库(b.dll),然而当我将属性页配置类型改为动态库再编译时提示“error LNK1104:无法打开文件a.lib”。...
  • .h头文件 .lib库文件 .dll动态库文件之间的关系

    万次阅读 多人点赞 2013-10-12 11:56:52
    .h头文件是编译时必须的,lib是链接时需要的...如果也使动态连接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。 .h .lib .dll三者的关系是: H文件作用是:声明函数接口 DLL文件作用是: 函数可执行代码
  • 先找到动态库的.dll和.lib文件并将其导入到同源文件相同级别的文件夹下面,然后在添加进其头文件,并右击项目处,然后点击链接,链接我们的lib文件(一定要是全名称包括扩展名),然后我们就可以调用动态库的函数了...
  • Linux下静态_的基本概念;...nm查看库中包含那些函数、ar生成静态,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与相关的参数-L,-l,-fPIC,-shared;静态链接时搜索过程;
  • linux 调用动态库so文件

    万次阅读 2012-05-02 14:55:09
    关于动态调用动态库方法说明 一、 动态库概述 1、 动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输出操作或屏幕控制等标准任务函数)。可以事先对这些函数...
  • 在代码开发的过程,常常碰到编译、链接、运行时加载dll 的问题,简单罗列一下: 1. 未包含头文件:  报错信息可能为: 编译错误 函数/类未定义   2. 包含头文件,未包含库lib/包含的lib不匹配:  报错信息可能...
  • 动态链接(dll)文件解析

    万次阅读 2017-07-25 21:07:01
    生成动态链接(dll文件)1、使用VS生成动态链接的步骤: (1)新建一个win32控制台工程,并在应用程序设置窗口选择“Dll”选项,附加选项选择“空项目”。如下图:(2)创建完工程之后,添加源文件,在源文件...
  • ...附加依赖项的是.lib不是.dll,若生成了dll,则肯定也生成lib文件。如果要完成源代码的编译和链接,有头文件和lib就够了。如果要使需要动态连接的程序运行起来,有dll就够了。在开发和调试阶

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 490,681
精华内容 196,272
关键字:

动态库中包含其他文件