我正在尝试启动C ++游戏引擎项目。
我对dll和lib的了解不多,但我认为引擎本身就是一个dll而且我会有单独的dll项目,如渲染器,输入等,它们将由引擎使用,引擎dll将是游戏使用。
我似乎在demo.exe项目中引用了引擎项目(通过添加引用并添加其他包含目录的路径),但是当尝试在引擎dll项目中添加对呈现器dll项目的引用时得到了:
错误LNK1104:无法打开文件'MyPath \ Renderer.lib'MyPath \ LINK 发动机
为什么提到libs?
答案 0 :(得分:9)
许多DLL都带有相应的LIB库,只有在链接阶段才需要。所以基本上有两种类型的LIB库:
包含所有目标文件的真实静态库
仅包含链接器定义的库,此类库附带DLL
所以基本上你需要链接这个LIB文件才能使用DLL
答案 1 :(得分:3)
所以我整理了我的问题。因为他们是新项目,他们还没有实现任何方法,所以没有创建lib,所以没有什么可以引用给我的。
但最后一件事是,我无法为头文件定义dllimport / dllexport宏。我试图让它定义dllexport当它的导出项目,但说我的项目是2个名称,例如“真棒引擎”然后如何实现显然是自动创建的导出宏?我应该在这个空间使用下划线吗?
#ifdef AWESOME_ENGINE_EXPORTS // Or AWESOMEENGINE_EXPORTS?
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif
答案 2 :(得分:2)
通常,
图书馆可能会以两种模式为您提供API:
动态:较小的可执行文件,但需要其DLL。
静态:较大的可执行文件,但是独立。
首先,决定如何静态或动态地使用该库?!然后配置您的项目,编译器可以找到该库的头文件。 然后,如果有必要将LIB文件添加到您的项目中。
在您的情况下:检查您是否正确地将LIB文件添加到项目或makefile中?
答案 3 :(得分:2)
在demo.exe项目中引用的引擎项目很好(通过添加引用并添加其他包含目录的路径)
某些库可以静态链接,这意味着您只需要头文件(.h
/ .hpp
)和.lib
文件。其他库可能需要动态链接,这将导致您的程序依赖于某些DLL文件,但通常您需要有头文件才能知道这些DLL中的内容。有时,这似乎是你的情况,你需要所有这些:头文件,静态库和DLL。
标题文件包含声明,它们定义类的结构,声明函数的原型等。静态库(.lib
文件)是包含函数,变量等定义的二进制文件,需要在编译时解析,因此当它们丢失时,链接器会抱怨。 动态链接库(DLL)也是二进制文件,但它们在运行时被解析,这意味着您真正需要它们的时间是您运行程序时。