如何创建依赖于动态 (.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 项目上执行此操作的信息,请查看 .
我在 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 项目上执行此操作的信息,请查看