如何在编译器里设置调用别人写好的lib和dll步骤

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在编译器里设置调用别人写好的lib和dll步骤相关的知识,希望对你有一定的参考价值。

如何在编译器(vs2008)里设置调用别人写好的lib和dll如何在编译器(vs2008)里设置调用别人写好的lib和dll步骤:1.Tools->options->projectsandsolutions->VC++directories分别在包含文件,库文件填加了路径(这些路径只告诉编译器怎么找文件,没有说把那里面的文件加入工程.)(若不设置,编译报错:无法打开***文件)2.Project->properties->c/c++->general->additionalincludedirectories添加包含文件Project->properties->linker->general->additionallibrarydirectories添加库文件Project->properties->linker->input->additionaladditionaldependencies添加用到的lib(这一步也可以在代码中显示调用#pragmacomment(lib,"***.lib"))(若不添加,连接报错:无法解析的外部符号)3.将dll文件拷贝到工程debug文件下(如果不拷贝,编译链接不报错,运行报错:无法找到***.dll)切记第三条,让老子排查了一上午,当然最好把所有输出目录定位到一个文件下面。附:DLL与LIB文件的区别共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamiclinklibrary。一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库staticlinklibrary。共有两种链接方式:动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。关于lib和dll的区别如下:(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。(3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress装载。使用lib需注意两个文件:(1).h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。(2).LIB文件,略。使用dll需注意三个文件:(1).h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。(2).LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress装载。(3).dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件 参考技术A c++中共有两种库:1、LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamiclinklibrary。(这种方式更灵活,写的程序体积小,但是需要.exe和dll同时发布)2、LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库staticlinklibrary。(这种方式不是很灵活,因为lib被编译到.exe中,写出的程序体积大,但是只需要发布exe即可,不需要dll文件)共有两种链接方式:1、动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。2、静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。关于lib和dll的区别如下:(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。(3)动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress装载。(静态连接)使用lib需注意两个文件:(1).h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。(2).LIB文件,略。(动态连接)使用dll需注意三个文件:(1).h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。(2).LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32API函数LoadLibrary、GetProcAddress装载。(3).dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。使用lib的方法:静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是cpp文件编译生成的。在编译这种静态库工程时,根本不会遇到链接错误;即使有错,也只会在使用这个lib的EXT文件或者DLL工程里暴露出来。在VC中新建一个staticlibrary类型的工程Lib,加入test.cpp文件和test.h文件(头文件内包括函数声明),然后编译,就生成了Lib.lib文件。别的工程要使用这个lib有两种方式:(1)在project->link->Object/LibraryModule中加入Lib.lib文件(先查询工程目录,再查询系统Lib目录);或者在源代码中加入指令#pragmacomment(lib,“Lib.lib”)。(2)将Lib.lib拷入工程所在目录,或者执行文件生成的目录,或者系统Lib目录中。(3)加入相应的头文件test.h。使用DLL的方法:使用动态链接中的lib,不是obj文件的集合,即里面不会有实际的实现,它只是提供动态链接到DLL所需要的信息,这种lib可以在编译一个DLL工程时由编译器生成。创建DLL工程的方法(略)。(1)隐式链接第一种方法是:通过project->link->Object/LibraryModule中加入.lib文件(或者在源代码中加入指令#pragmacomment(lib,“Lib.lib”)),并将.dll文件置入工程所在目录,然后添加对应的.h头文件。#include"stdafx.h"#include"DLLSample.h"#pragmacomment(lib,"DLLSample.lib")//你也可以在项目属性中设置库的链接intmain()TestDLL(123);//dll中的函数,在DllSample.h中声明return(1);(2)显式链接需要函数指针和WIN32API函数LoadLibrary、GetProcAddress装载,使用这种载入方法,不需要.lib文件和.h头文件,只需要.dll文件即可(将.dll文件置入工程目录中)。#include#include//使用函数和某些特殊变量typedefvoid(*DLLFunc)(int);intmain()DLLFuncdllFunc;HINSTANCEhInstLibrary=LoadLibrary("DLLSample.dll");if(hInstLibrary==NULL)FreeLibrary(hInstLibrary);dllFunc=(DLLFunc)GetProcAddress(hInstLibrary,"TestDLL");if(dllFunc==NULL)FreeLibrary(hInstLibrary);dllFunc(123);std::cin.get();FreeLibrary(hInstLibrary);return(1);LoadLibrary函数利用一个名称作为参数,获得DLL的实例(HINSTANCE类型是实例的句柄),通常调用该函数后需要查看一下函数返回是否成功,如果不成功则返回NULL(句柄无效),此时调用函数FreeLibrary释放DLL获得的内存。GetProcAddress函数利用DLL的句柄和函数的名称作为参数,返回相应的函数指针,同时必须使用强转;判断函数指针是否为NULL,如果是则调用函数FreeLibrary释放DLL获得的内存。此后,可以使用函数指针来调用实际的函数。最后要记得使用FreeLibrary函数释放内存。注意:应用程序如何找到DLL文件?使用LoadLibrary显式链接,那么在函数的参数中可以指定DLL文件的完整路径;如果不指定路径,或者进行隐式链接,Windows将遵循下面的搜索顺序来定位DLL:(1)包含EXE文件的目录(2)工程目录(3)Windows系统目录(4)Windows目录(5)列在Path环境变量中的一系列目录 参考技术B 如何在编译器(vs2008)里设置调用别人写好的lib和dll
步骤:1.Tools->options->projects and solutions->VC++ directories分别在包含文件,库文件填加了路径

(这些路径只告诉编译器怎么找文件,没有说把那里面的文件加入工程.)

(若不设置,编译报错:无法打开***文件)

2.Project->properties->c/c++->general->additional include directories 添加包含文件

Project->properties->linker->general->additional library directories 添加库文件

Project->properties->linker->input->additional additional dependencies添加用到的lib

(这一步也可以在代码中显示调用 #pragma comment(lib, "***.lib") )

(若不添加,连接报错:无法解析的外部符号)

3.将dll文件拷贝到工程debug文件下(如果不拷贝,编译链接不报错,运行报错:无法找到***.dll)切记第三条,让老子排查了一上午,当然最好把所有输出目录定位到一个文件下面。

附:

DLL与LIB文件的区别

共有两种库:
一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接 库dynamic link library。
一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。
共有两种链接方式:
动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定 位DLL函数的可执行代码所需的信息。
静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件 中。本回答被提问者采纳

Unity闲谈如何把写好的插件卖到AssetStore

 

        我很久之前写了个插件叫 MagicVoxel Toolbox,地址:u3d.as/tWS 上架已经几年了。今天就来说一下将写好的插件发布到 Unity 的 AssetStore 需要注意些什么。

 

● 发布之前

     确保你的插件是自己原创的,绝对不能盗用别人的成果,即使是发布免费插件也要原创。

 


     你的插件里不能出现商标,跑车可以有,但法拉利车不行、手机可以但苹果手机不行。


     开一个新工程来测试插件,确保用新工程导入package之后,你的插件能够毫无阻碍的正常运转。


     美工类插件也要做测试,确保材质球都能正常连接,模型要做好面数优化;


     音效类素材最好提供多种文件格式与音质;


     代码类插件别报Error,记得写详细的帮助文档;


     任何插件都需要写ReadMe,说明版权、作者联系方式等信息(英语)。ReadMe不管需不需要都得写,否则可能会过不了审核;

 

     如果你的插件需要打开自己的Editor窗口,尽量把开启窗口的选项放在Tools标签里(如图),如果你把自己的标签放在了根目录下,可能会过不了审核。注意是Tools,T要大写,最后有s 。


          

     你的package里需要有Demo,可以是场景,也可以是拖拽即用的prefab,总之,要让用户能够毫无开发成本的测试一下你的插件,证明你的插件是货真价实的。


     代码类插件必须用自己的命名空间,脚本文件不能用常用的文件名,比如AudioManager.cs、Utility.cs 等都是不能用的,要改成类似 XXX_AudioManager.cs 这样(XXX是插件名的缩写)。


     确保你的插件放在Assets文件夹下的任何位置都能用,有些用户喜欢把外部插件放在同一个文件夹下(而不是Assets根目录),你的程序要在用户改变插件位置时重新获取资源路径。


     插件的UI一定要符合正常人的思维方式,能用代码做的事情就不能弹出个窗口去叫用户做。需要等待(比如转换文件格式、生成模型等)时一定要有进度条,完成时要弹出窗口提示,要让用户明确的知道发生了什么。

 

 

● 准备发布

 

第一次发布的话,需要把Unity账号转成开发者账号(免费)。先打开这个网址:publisher.assetstore.unity3d.com/login.html,登陆你的普通Unity账号,一番套路之后就能转为开发者账号,这步并不需要复杂的信息,任何人都能免费转型。完成后再次打开刚才的网址并登陆相同的账号即可,以后管理插件就在这里,所以最好收藏一下。




登陆开发者账号后,我们就要创建一个草稿了。在插件正式提交之前,你可以随意的修改里面的内容,这时的插件被定义为草稿(draft)。按照下图提示,点击packages,然后点击Create New Package。




你将看到下图界面,你的Title将是Utitled,点击提示的位置写个标题吧。



在下图这里写标题。写完点Save保存信息。
下图中的Description对应你在AssetStore里看到的产品描述,KeyWords是搜索用的关键词,产品描述一定要好好写,确保用户能看出你的插件是干什么用的、怎么用的。






写好上述MetaData后,点GoBack回到下图这里。
先把版本写好,这个别写乱了就行,确保版本号不会倒退,Unity官方是不会帮你检查的;
然后是插件类型,别忘了选,选错会被退回来;
价格,默认免费,根据插件的规模与质量合理定制,不要低估或高估,具体价格参考AssetStore里的其它插件即可。
最后别忘了点保存按钮。




写好信息后,就改上传插件了。
先下载Unity官方的AssetStoreTools插件(免费),需要用这货传插件。
地址:http://www.assetstore.unity3d.com/cn/#!content/115,它的本质其实就是普通的插件,和AssetStore里的其它插件都是一类事物。这个插件的作用就是“把Assets文件夹里的一个指定文件自动打包成package,并上传到刚才的网站上”。
下载完后,新建一个空的工程(必须),导入你的插件和上述AssetStoreTools。你的导航栏会多一个选项(如图),(他们自己的插件都没把选项放在Tools里怎么过的审?)




点击PackageUpload,弹出下图窗口,启动的可能有点慢。然后选择一个草稿,选择你的插件所在的文件夹,选择要在AssetStore的Preview里显示的文件,最后点上传。




传完后,你会发现这里会显示上传的时间。
 

 

 

 

 

上传插件截图。
在下图处点击Screenshots,可以上传AssetStore里看到的那些截图。视频在Audio/Video那里上传,视频永远排在截图前面。顺便视频要传到YouTube上,然后给连接,翻墙什么的自行解决。
最重要的是KeyImage,按照官方样板的提示来设计插件的 封面、小封面和图标这三张图,注意不要超过样板中的界限。这三张图一定要精心设计,因为会关系到之后的销量,最好多花的时间。


确保所有的信息都填对后,就可以正式提交啦~~
注意,一旦提交就会开始审核,需要等7~15天才会出结果。出结果之前是不能再修改的,虽说可以再提交一份,但这样会让你的package管理界面非常乱,所以一定要谨慎核对信息后,再确定发布。


Unity官方会在审核开始和结束后给你发送电子邮件,注意查收。如果审核没有通过,拒绝的理由会写在邮件里。
通过了审核后,你就可以在published里看到package了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于如何在编译器里设置调用别人写好的lib和dll步骤的主要内容,如果未能解决你的问题,请参考以下文章

Python如何调用别人写好的脚本

Qt Creator开发Android程序 如何调用C语言的dll

c# dllimport怎么弱引用

怎么将qt的开源库封装成dll

环境小硕的转行之路-25-模块的导入与管理

c语言怎么调用dll文件