在Windows下,当我在MSVC的DLL项目中编译C / C ++代码时,我得到2个文件:
MyDll.dllMyDll.lib据我了解,MyDll.lib其中包含某种指示符表,用于指示dll中的函数位置。使用此dll时(例如在exe文件中),MyDll.lib在链接期间会嵌入到exe文件中,因此在运行时它“知道”函数的位置MyDll.dll并可以使用它们。
但是,如果我在Linux下编译相同的代码,我只会得到一个MySo.so不带 文件的文件MySo.a(相当于libLinux中的文件),那么MySo.so如果在链接过程中未嵌入任何内容,Linux下的可执行文件如何知道函数的位置?
我有简单的程序如下:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
project(test LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR})
add_executable(test main.cpp)
target_include_directories(test PRIVATE ${PROJECT_SOURCE_DIR})
target_link_libraries(test PRIVATE power.dll)
Run Code Online (Sandbox Code Playgroud)
主.cpp:
#include <iostream>
#include "power.h"
using namespace std;
int main()
{
cout << "Hello World!" << endl;
power(4.);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
功率.h:
#ifndef POWER_H
#define POWER_H
double power(double number) noexcept;
#endif // POWER_H
Run Code Online (Sandbox Code Playgroud)
的实现power.h在一个名为 .dll 的文件中power.dll。如果我用 MinGW 7.3.0 X64 编译这个项目说:
error: undefined reference to `power(double)'
Run Code Online (Sandbox Code Playgroud)
如果我用 MSVC 2017 X64 编译它说:
error: LNK1104: cannot open file 'power.lib' …Run Code Online (Sandbox Code Playgroud) 我正在尝试启动一个C++游戏引擎项目.
我对dll和lib的了解不多,但是我认为引擎本身就是一个dll而且我会有单独的dll项目,如渲染器,输入等引擎将使用的引擎dll将被引擎使用游戏.
我似乎在demo.exe项目中引用了引擎项目(通过添加引用并添加其他包含目录的路径)但是当我尝试在引擎dll项目中添加对renderer dll项目的引用时我得到了:
错误LNK1104:无法打开文件'MyPath\Renderer.lib'MyPath\LINK Engine
为什么提到libs?
处理从DLL创建LIB的一般方法在如何在有.dll文件和头文件的情况下创建.lib文件中描述- 仍然是为具有未修饰stdcall函数的DLL创建导入库(例如核心WinAPI DLL kernel32.dll等) .),一个要经过一个相当漫长和复杂的过程(如例如描述这里).对于具有许多功能的DLL,此过程非常耗时且容易出错 - 当原始DLL发生更改时(例如,由于供应商更新),它在自动渲染情况下也很容易失败.
有没有一种有效的自动化方法?
在Windows C ++中,当您要链接到DLL时,必须提供一个导入库。但是在GNU构建系统中,当您想链接.so文件时,就相当于您不希望使用的dll。为什么是这样?是否有等效的Windows导入库。
注意:我并不是说要在Windows中使用GNU C ++的情况,在这种情况下还必须使用导入库。分割线是在Windows C ++和Linux C ++之间。
您能帮我了解一下,为什么从dll导入函数和数据时我们需要.lib文件吗?
我听说,它包含来自相应dll的导出函数和数据元素的列表,但是当我使用CFF Explorer探索我的dll时,我发现dll已经具有导出函数的地址,因此从理论上讲我可以链接我的.dll的程序,没有任何其他文件。
您能否详细解释一下.lib文件中存储的数据类型?
而且,是的,我知道,Visual Studio迫使我们将.lib文件添加到其他依赖项部分,但是为什么它真正需要它们呢?