【问题标题】:VS2019: Linking Static Library Functions to DLLVS2019:将静态库函数链接到 DLL
【发布时间】:2022-01-02 02:16:39
【问题描述】:

我的 Visual Studio 解决方案中有三个项目:项目 A、项目、B 和项目 C。项目 A 和 B 分别编译为 A.lib 和 B.lib,项目 C 编译为 C.dll。我想将 A.lib 和 B.lib 中的函数放入 C.dll 中 - 我该怎么做才能实现这一点?我感觉我在错误的时间使用了 __declspec(dllexport),或者我忘记了链接。

=== 项目 A ===

foo.h

#include <iostream>
__declspec(dllexport) void foo();

foo.cpp

#include "foo.h"
void foo()
{
    std::cout << "Foo!\n";
}

=== 项目 B ===

goo.h

#include <iostream>
__declspec(dllexport) void goo();

goo.cpp

#include "goo.h"
void goo()
{
    std::cout << "Goo!\n";
}

=== 项目 C ===

// What goes here?

【问题讨论】:

  • 您需要将 A、B 和 C 的公共标头连同您已与静态库 A 和B.

标签: c++ visual-studio dll linker static-libraries


【解决方案1】:

静态库中无需使用__declspec(dllexport)。

foo.h 可以修改为:

#include <iostream>
 void foo();

不要忘记在 Dll 的属性中添加 lib 文件。供您参考: Create and use a static library Create and use your own Dynamic Link Library (C++)

我的DLL: 头文件.h

#pragma once
#include"foo.h"
#include"goo.h"

#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dllexport)
#else
#define MATHLIBRARY_API __declspec(dllimport)
#endif

extern "C" MATHLIBRARY_API  void Myfun();

Cpp 文件

#include"Header.h"
void Myfun()
{   
        foo();
        goo();
}

测试项目:

#include <iostream>
#include"Header.h"//from MyDll
int main()
{
    Myfun(); 
}

在测试项目中,我只输入了Mydll.lib。我还包括 foo.h 和 goo.h 的目录。

输出:

Foo!
Goo!

【讨论】:

  • @Randy Price 您好,请问您的问题是否已解决?如果您有任何其他问题,我很乐意为您提供帮助。
  • 不完全。据我了解,您基本上已经为 foo 和 goo 制作了一个包装器,它们是通过调用 MyFun 的 dll 函数执行的。如果可能的话,我想要完成的是:将 foo 和 goo 分别编译到 A.lib 和 B.lib 中,然后将 foo 和 goo 从 A.lib 和 B.lib 中“提取”或“移动”到 C 中。 dll,以便可以直接从 C.dll 调用它们。谢谢!
  • 我的 sn-p 中的 @Randy Foo 和 goo 分别用 A.lib 和 B.lib 编写。您需要修改两个库中的代码(删除 __declspec(dllexport))。 Myfun 是为了证明 a.lib 和 b.lib 在 C.dll 中运行良好,你可以将 Myfun 替换成你想要的任何函数。
  • 了解 - 也许我的问题措辞不正确。在将 foo 和 goo 分别编译到 A.lib 和 B.lib 之后,我想将它们移动到 C.dll 中,这样我可以在编译 C.dll 后直接从 C.dll 调用它们。例如,使用 MATLAB 的 calllib 函数直接从 C.dll 调用 foo。
  • 恐怕你需要听听理查德的建议或者做个包装。
猜你喜欢
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 2011-01-24
相关资源
最近更新 更多