如何创建依赖于动态 (.dll) tensorflow 库的静态库 (.lib)?

How do I create a static library (.lib) which depends on the dynamic (.dll) tensorflow library?

我在 Visual Studio 2019 年 Windows 10 上创建了一个静态 C 库,它依赖于动态 (.dll) 的 tensorflow 库。我的库,我们称之为 A.lib,包含一个获取数据的函数,将其传递给张量流模型和 returns 模型的输出。编译似乎运行良好并创建了一个 A.lib 文件。

现在我想在另一个项目中使用我的静态库来创建一个.exe。让我们称之为 B。我将 header A.h 和 A.lib 复制到 B 项目中并调整项目属性,以便可以找到我的库。

问题是我收到 LNK2001 错误,因为链接器找不到我在 A.lib.

中调用的 tensorflow 函数的定义

我也尝试将 tensorflow 库复制到我的项目 B 中。但这并没有帮助。

我需要做什么才能正确包含这些库?或者是否有更简单的替代方案来在 C 中部署卷积神经网络?

这里是 [SO]: How to create a Minimal, Reproducible Example (reprex (mcve))

dll00.h:

#if defined(_WIN32)
#  if defined(DLL00_EXPORTS)
#    define DLL00_EXPORT_API __declspec(dllexport)
#  else
#    define DLL00_EXPORT_API __declspec(dllimport)
#  endif
#else
#  define DLL00_EXPORT_API
#endif


#if defined(__cplusplus)
extern "C" {
#endif

DLL00_EXPORT_API int dll00Func00();

#if defined(__cplusplus)
}
#endif

dll00.c:

#define DLL00_EXPORTS
#include "dll00.h"

#include <stdio.h>


int dll00Func00() {
    printf("%s - %d - %s\n", __FILE__, __LINE__, __FUNCTION__);
    return -3;
}

lib00.h:

#if defined(__cplusplus)
extern "C" {
#endif

int lib00Func00();

#if defined(__cplusplus)
}
#endif

lib00.c:

#include "lib00.h"

#include "dll00.h"

#include <stdio.h>


int lib00Func00() {
    printf("%s - %d - %s\n", __FILE__, __LINE__, __FUNCTION__);
    return dll00Func00() - 3;
}

main00.c:

#include "lib00.h"

#include <stdio.h>


int main() {
    printf("%s - %d - %s\n", __FILE__, __LINE__, __FUNCTION__);
    int res = lib00Func00();
    printf("Lib func returned: %d\n", res);
    printf("\nDone.\n");
    return 0;
}

输出:

[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q069197545]> sopr.bat
### Set shorter prompt to better fit when pasted in Whosebug (or other) pages ###

[prompt]> "c:\Install\pc032\Microsoft\VisualStudioCommunity19\VC\Auxiliary\Build\vcvarsall.bat" x64 >nul

[prompt]> dir /b
dll00.c
dll00.h
lib00.c
lib00.h
main00.c

[prompt]> :: Build .dll (1 step)
[prompt]> cl /nologo /MD /DDLL dll00.c  /link /NOLOGO /DLL /OUT:dll00.dll
dll00.c
   Creating library dll00.lib and object dll00.exp

[prompt]> :: Build .lib (2 steps)
[prompt]> cl /c /nologo /MD /Folib00.obj lib00.c
lib00.c

[prompt]> lib /NOLOGO /OUT:lib00.lib lib00.obj

[prompt]> :: Build .exe (1 step)
[prompt]> cl /nologo /MD /W0 main00.c  /link /NOLOGO /OUT:main00_pc064.exe lib00.lib dll00.lib
main00.c

[prompt]> dir /b
dll00.c
dll00.dll
dll00.exp
dll00.h
dll00.lib
dll00.obj
lib00.c
lib00.h
lib00.lib
lib00.obj
main00.c
main00.obj
main00_pc064.exe

[prompt]> main00_pc064.exe
main00.c - 7 - main
lib00.c - 9 - lib00Func00
dll00.c - 8 - dll00Func00
Lib func returned: -6

Done.

所以,它有效(至少这个简单的例子)。
正如所见,在构建 .exe 时,我还通过了 .dll.lib 到链接器(这意味着 .dll(连同它的所有(重复)依赖项)在运行时是必需的)。有关如何在 VStudio 项目上执行此操作的信息,请查看 .