精华内容
下载资源
问答
  • opengl的动态链接头文件,在不同平台上调试OpenGL程序时,需要用到的头文件和静态链接,因为在vs2008中没有glaux文件。
  • vc6.0中没有这个动态连接,以及相应的头文件
  • 动态库负责产生数据,调用程序读取这些数据。但是写的类型和读的方式(类型)不一样,导致数据丢失...教训是尽量不要让同一个头文件有两份,特别是在使用自己制作动态库的情况下。若有两份,请牢记同步! ...

       动态库负责产生数据,调用程序读取这些数据。但是写的类型和读的方式(类型)不一样,导致数据丢失(溢出),不能正确解析数据。教训是尽量不要让同一个头文件有两份,特别是在使用自己制作动态库的情况下。若有两份,请牢记同步!





    转载于:https://my.oschina.net/houranlee/blog/363914

    展开全文
  • 动态库:[Windows 下 .dll,Linux 下 .so] 之外, 必须提供头文件。头文件是你这个库里面提供了那些接口可以供外界使用。 如果没有头文件,其他人无法使用,因为不知道函数方法的原型! 2、在为某些软件项目写插件,而...

    不一定需要。创建一个库一般处于以下两种目的:
    1、把一些相关的代码,打包成一个库,发布给其它的人用。
    这中情况是最常见的情况,如写 C 语言用到 libgcc。在这种情况下,你除了提供库文件:
    静态库[ windows 下 .lib,linux .a];动态库:[Windows 下 .dll,Linux 下 .so] 之外,
    必须提供头文件。头文件是你这个库里面提供了那些接口可以供外界使用。
    如果没有头文件,其他人无法使用,因为不知道函数方法的原型!

    2、在为某些软件项目写插件,而这些项目软件是公司内部的;或者说自己相对熟悉可接触的,
    即是可以直接得知可能用到的函数方法的原型(函数名,参数列表,返回值等)的;
    就没有必要单独列出头文件,直接作为库使用也是可以的;
    很多大的项目,都是模块化设计,留有一些特定的接口,方便定制。当程序运行时,
    会动态加载指定目录下的动态库,运行时调用动态库里面约定好的方法。
    这种情况无需提供头文件,但要按照特定的约定来实现这个库。
    总之:
    当调用方还不知道不清楚函数原型的时候:动态库中的函数方法的原型(函数名,参数,返回值等)的情况下;
    (1)代码编写时候;
    调用方是不知道如何使用该库的,所以是需要头文件帮助,来编写调用代码的;
    而不是真的需要函数原型所在头文件本身,只是为了知道了函数原型即可!
    然后库文件存在就可以直接调用.
    (2)代码编译时
    如果是静态调用静态库或动态库,都是需要库的头文件参加编译的;
    如果是动态加载动态库(dlopen/load),则不需要头文件,只需要库文件.
    (3)代码运行时
    运行时,无论静态库还是 动态库,都不需要头文件;
    运行时,静态库是不需要的,
    如若是动态库,运行时候是需要的!
    当调用方已经知道:库中的函数方法原型时候,是不需要头文件帮助,就能够编写库中方法的调用代码的;

    静态编译链接必须要。动态调用可以不要。

    不过还是要知道有哪些函数,怎么声明的。

    自己写的当然没问题啦
    你知道dll中的函数名称和参数就行了,别的什么都不用,loadlibrary就行了

    展开全文
  • 方法,先解压,得到文件,头文件动态链接文件。 (1)把.h复制到C:\Program Files\Windows Kits\8.0\Include\um\gl文件夹中,如果没有gl这个文件夹则可以自己新建一个。(x是你安装VS的盘符号) (2)把解压得到...
  • 三、为什么只用在程序头部写上包含的头文件头文件中并没有实现内容就可以使用声明的函数呢?动静态区别1.可执行文件大小不一样2.占用磁盘大小不一样3.拓展性与兼容性不一样4.依赖不一样5.复杂性不一样6.加载速度...

    一、什么是头文件?什么是库文件?有什么区别?

    先说总结

    头文件是包含函数声明,宏定义,类的声明的文件。

    在linux中一般头文件会在/usr/include中,如果没有可以使用 locate命令查找文件所在位置。

    库文件是一种目标文件,静态库是可重定位目标文件,动态库是共享目标文件。(后面有解释)

    一般在/usr/lib、/usr/lib64、/lib、/lib64都包含库文件

    头文件是在预处理时使用;库文件是链接时使用。

    头文件内容还是高级语言内容;库文件是二进制文件。

    目标文件

    在解释静态库和动态库之前,需要简单了解一下什么是目标文件。目标文件常常按照特定格式来组织,在linux下,它是ELF格式(Executable Linkable Format,可执行可链接格式),而在windows下是PE(Portable Executable,可移植可执行)。

    而通常目标文件有三种形式:

    • 可执行目标文件。即我们通常所认识的,可直接运行的二进制文件。

    • 可重定位目标文件。包含了二进制的代码和数据,可以与其他可重定位目标文件合并,并创建一个可执行目标文件。

    • 共享目标文件。它是一种在加载或者运行时进行链接的特殊可重定位目标文件。

      使用readelf -a filename 可以查看目标文件的ELF格式

    二、什么是静态库?什么是动态库?有什么区别?

    静态库在linux中是以.a(archive)为后缀,作用是在进行链接生成可执行文件时,从静态库文件中拷贝需要的内容到最终的可执行文件中。

    //在使用gcc编译时采用 -static选项来进行静态文件的链接:

    gcc -c main.c

    gcc -static -o main main.o

    动态库在linux中是以.so(shared object)为后缀,它并不在链接时将需要的二进制代码都拷贝到可执行文件中,而是拷贝一些重定位和符号表信息,当程序运行时需要的时候再通过符号表从动态库中获取。

    //使用gcc编译默认采用动态链接

    gcc -o main main.c

    三、为什么只用在程序头部写上包含的头文件,头文件中并没有实现内容就可以使用声明的函数呢?

    首先要熟悉程序编译过程

    预处理->编译->汇编->链接

    • 预处理(preprocessing)的时候把头文件内容包含进来。

    gcc -E -o main.i main.c

    • 编译,但不包括汇编(compilation, do not assemble)将预处理后的文件转换成汇编代码。

    gcc -S -o main.S main.i

    • 汇编将编译后的程序转换为二进制文件,也就是可重定向目标文件。

    gcc -c -o main.o main.S

    • 链接将具体的动态库或者静态库中的代码(也就是包的头文件中的代码实现部分)拷贝代码或拷贝符号表的方式,生成可执行目标文件。

    gcc -o main main.o

    动静态库区别

    1.可执行文件大小不一样

    静态链接的可执行文件要比动态链接的可执行文件大得多,因为它将需要用到的代码从二进制文件中拷贝了一份,而动态链接仅仅是复制了一些重定位和符号表信息。

    2.占用磁盘大小不一样

    如果有多个可执行文件,那么静态库中的同一个函数的代码就会被复制多次,而动态库只有一份,因此使用静态库占用的磁盘空间相对比动态库要大。

    3.拓展性与兼容性不一样

    如果静态库中某个函数的实现变了,那么可执行文件必须重新编译,而对于动态链接生成的可执行文件,只需要更新动态库本身即可,不需要重新编译可执行文件。正因如此,使用动态库的程序方便升级和部署。

    4.依赖不一样

    静态连接的可执行文件不需要依赖其他的内容即可运行,而动态链接的可执行文件必须依赖动态库的存在。所以如果你在安装一些软件的时候,提示某个动态库不存在的时候也就不奇怪了。

    即便如此,系统中一般存在一些大量公用的库,所以使用动态库并不会有什么问题。

    5.复杂性不一样

    相对来说,动态库的处理要比静态库要复杂,例如如何在运行时确认地址?多个进程如何共享一个动态库?当然,作为调用者我们不需要关注,另外动态库版本的管理也是一项技术活。这也不在本文的讨论范围。

    6.加载速度不一样

    由于静态库在链接时就和可执行文件在一块了,而动态库在加载或者运行时才链接,因此,对于同样的程序,静态链接的要比动态链接加载更快。所以选择静态库还是动态库是空间和时间的考量。但是通常来说,牺牲这点性能来换取程序在空间上的节省和部署的灵活性是值得的。再加上局部性原理,牺牲的性能并不多。(局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。)

    四、如何生成动静态库文件

    静态库的生成

    //1.先写出相应的.h文件和对应的.c文件

    //2.编译.c文件

    //3.使用ar工具将.o文件归档生成.a静态库文件

    [root@localhost linux]# ls
    add.c add.h main.c sub.c sub.h
    [root@localhost linux]# gcc -c add.c -o add.o
    [root@localhost linux]# gcc -c sub.c -o sub.o
    生成静态库
    [root@localhost linux]# ar -rc libmymath.a add.o sub.o
    ar是gnu归档工具,rc表示(replace and create)
    查看静态库中的目录列表
    [root@localhost linux]# ar -tv libmymath.a
    rw-r–r-- 0/0 1240 Sep 15 16:53 2017 add.o
    rw-r–r-- 0/0 1240 Sep 15 16:53 2017 sub.o
    t:列出静态库中的文件
    v:verbose 详细信息
    [root@localhost linux]# gcc main.c -L. -lmymath
    -L 指定库路径
    -l 指定库名
    测试目标文件生成后,静态库删掉,程序照样可以运行。

    注意:静态库文件和动态库文件的命名规则是libxxxx.so/libxxxx.a,在进行 链接时只用lxxxx即可

    库文件的搜索路径

    • 从左往右搜索-L指定的目录
    • 有环境变量指定的目录(LIBRAY_PATH)
    • 由系统指定的目录
      • /usr/lib
      • /usr/local/lib

    动态库的生成

    • shared:表示生成共享库格式
    • fPIC:产生位置无关码(position independent code)

    示例:

    [root@localhost linux]# gcc -fPIC -c sub.c add.c

    [root@localhost linux]# gcc -shared -o libmymath.so *.o

    [root@localhost linux]# ls

    add.c add.h add.o libmymath.so main.c sub.c sub.h sub.o

    总结

    静态库和动态库的具体链接方式并没在本文讨论,本文仅仅介绍动静态库的区别和是什么和怎么生成,对于我来说已经足够。更多内容需要读者自行阅读相关书籍。

    参考

    参考链接

    展开全文
  • 很多时候,某些动态库会被很多程序...这样动态库就自动加入到内核中了,不过这个时候并没有加入到sdk中。  2,sdk中必须把必要的lib和.h文件加入进来。简单的方法是直接加入到sdk生成的目录中,不过下次重新安装的时

        很多时候,某些动态库会被很多程序调用,而这些动态库是已经通过测试的,那么我们可以把它们加入到内核与sdk中,做为系统动态库。方法如下。

        1.在PB subproject中加入加入这个动态库项目,编译。这样动态库就自动加入到内核中了,不过这个时候并没有加入到sdk中。

        2,sdk中必须把必要的lib和.h文件加入进来。简单的方法是直接加入到sdk生成的目录中,不过下次重新安装的时候就没有了。好的方法是,加入到sdk的msi安装文件中,可以考虑加入到:\WINCE600\PUBLIC\COMMON\SDK中。

        当然,sdk没有加入也没有关系,创建项目的时候放到项目下面也是可以的。

    展开全文
  • 学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库,什么是编译:编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了。一把翻译再执行编译型...
  • 学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了。一把翻译再执行 ...
  • 用于加、解密,用C++写的动态库。同时将动态库的调用封装为一个类,方便大家的使用。本库已经用于我自己做过的很多程序,没有出现问题。
  • 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or ...
  • 头文件文件: 区别: 1 头文件是文本文件,是可供阅读的;文件是二进制文件,不可直接阅读。...二者也有联系:1 虽然没有规定调用库函数必须引用头文件,但一般约定,当调用库函数的时候需要引用接口...
  • C++头文件文件

    2021-05-08 17:41:46
    头文件是指在C/C++编程中,...库文件可分为静态库和动态库两种。 二者的区别为: 1 头文件是文本文件,是可供阅读的;库文件是二进制文件,不可直接阅读。 2 头文件在编译中使用;库文件在链接中使用。 3 头文件中是函
  • 头文件文件

    2014-03-17 11:24:00
    在早期的编程语言中Basic Fortan没有头文件的概念,c++/c语言的初学者虽然会使用头文件,但是常常不明其理。  1、通过头文件来调用功能。 在很多场合,源代码不便(或不准)向用户公布, 只...
  • 当考虑怎样总结这个头文件动态链接的查找问题时,我想到了一个程序从生到死的历程。写过很多程序,编译过很多程序,也运行过很多程序,对一个程序的从生到死,感觉很简单,也就没有做更多的或者说深入的思考与...
  • 头文件已经引用了,而且对应的文件或者源码文件都在工程里,但是就是提示找不到。 IDE可以提示跳转,说明是可以找到函数实现的,但是跳转直接跳到了.c文件里。 这才让我恍然明白,这个文件是c写的,而我的工程是...
  • 没有比人更高的山,没用比脚更长的路! .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件。如果要完成源代码的编译和链接,有...
  • 我现在编好了一个工程,但是我引用了从市场上购买的DIO卡和其他卡的头文件动态库文件。我在工程里设置好了*.lib文件的引用和添加卡的头文件,在Debug下运行,没有语法错误,运行有错误对话框提示:应用程序发生...
  • 整理自:http://zhidao.baidu.com/question/125294972.html=========================================================Q:一台仪器资料中提供了动态链接头文件,而动态链接没有方法,所有的可调用方法都在...
  • 3,.lib分两种情况,分别对应静态链接(lib是静态)与动态链接(动态链接的导入import library)然后:如果程序是静态链接,那么只需要h与lib文件,lib文件中含有函数代码;如果是动态链接,那么lib作为导入库,...
  • 关于头文件,库函数,静态库,动态库,的一系列迷惑... 还有就是编译完了以后叫做目标文件(???这个时候库函数的代码还没有加进来的吧???) =================== 是的,编译得到 .obj 文件, ...
  • 当考虑怎样总结这个头文件动态链接的查找问题时,我想到了一个程序从生到死的历程。写过很多程序,编译过很多程序,也运行过很多程序,对一个程序的从生到死,感觉很简单,也就没有做更多的或者说深入的思考与...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 573
精华内容 229
关键字:

动态库没有头文件