【问题标题】:Compile exe with static (.lib) and dynamic (.dll) libraries in same solution - visual studio在同一解决方案中使用静态 (.lib) 和动态 (.dll) 库编译 exe - Visual Studio
【发布时间】:2023-03-08 21:52:01
【问题描述】:

我有一个包含各种项目的 Visual Studio 解决方案:静态库项目(创建 *.lib 文件)、动态库项目(创建 *.dll 文件)和一个 exe 项目(创建 *.exe 文件)

exe 项目使用(或者更好地说 - 取决于)静态和动态库。

我在配置属性->链接器->常规中添加了dll文件的路径,在配置属性->链接器->输入中添加了.lib文件的名称。

问题是当我尝试构建 exe 项目时,链接器出现同样的错误:

LNK2019 未解析的外部符号...在函数中引用...

每次使用 dll 函数都会出现此错误。

项目配置中缺少什么,所以我的链接器会满足吗?

编辑: - 要导出的所需函数示例:

extern "C" {
    void foo1(int i);
    void foo2(int i);
    ...
}

【问题讨论】:

  • "...动态库项目(创建 *.dll 文件)...":还应该创建 .lib 文件,这些文件是这些需要的导入/导出定义联系起来。
  • 什么意思?我需要从同一个项目中创建 dll 和 lib?
  • 没有默认的 Visual Studio DLL 项目会自动输出 *.DLL 和导入/导出 *.LIB。 DLL 包含代码,而 LIB 只是一个引用 DLL 的存根库。然后链接库以使用 DLL 中的函数。在运行时,LIB 中的存根代码会导致调用系统加载程序以加载 DLL 并修复入口点。
  • 在 MSDN 上查找 __declspec importexport 使用条件 #defines 用于导入导出和 Linux 差异。
  • 或使用.DEF 文件来定义导出。

标签: c++ visual-studio dll linker-errors


【解决方案1】:

要使用 dll 启用 exe 项目 - 我需要将 __declspec(dllexport) 添加到 API 函数:

#define LIBRARY_API __declspec(dllexport)
extern "C" {
    LIBRARY_API void foo1(int i);
    LIBRARY_API void foo2(int i);
    ...
}

然后编译器还为每个 .dll 项目创建了 .lib,我可以将 .lib 文件添加到链接器 -> 在项目属性中输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多