我在Windows 10的Visual Studio 2019中創建了一個靜態C庫,它依賴于tensorflow庫,而tensorflow庫是動態的(.dll)。我的庫,讓我們稱之為A.lib,包含一個函式,它接收資料,將其傳遞給一個tensorflow模型,并回傳模型的輸出。編譯作業似乎進展順利,并創建了一個A.lib檔案。
現在我想在另一個專案中使用我的靜態庫來創建一個.exe。我將頭檔案 A.h 和 A.lib 復制到 B 專案中,并調整了專案屬性,以便能夠找到我的庫。
問題是,我得到了 LNK2001 錯誤,因為聯結器找不到我在 A.lib 中呼叫的 tensorflow 函式的定義。
我試著把tensorflow庫也復制到我的專案B中。但這并沒有幫助。
我應該怎么做?
我應該怎么做才能正確包含這些庫呢?或者有什么更簡單的方法來部署C語言中的卷積神經網路?
uj5u.com熱心網友回復:
這里有一個[SO]:如何創建一個最小的、可重復的例子(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"/span> {
#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
", __FILE__, __LINE__, __FUNCTION__)。)
return 3。
lib00.h:
#if defined(__cplusplus)
extern "C"/span> {
#endif
int lib00Func00()。
#if defined(__cplusplus).
}
#endif
lib00.c:
#include "lib00.h"
#include "dll00.h"
#include <stdio.h>
int lib00Func00() {
printf("%s - %d - %s
", __FILE__, __LINE__, __FUNCTION__)。)
return dll00Func00() - 3;
}
main00.c:
#include "lib00.h"
#include <stdio.h>
int main() {
printf("%s - %d - %s
", __FILE__, __LINE__, __FUNCTION__)。)
int res = lib00Func00()。
printf("lib func returned: %d
", res)。)
printf("
完成了。
")。)
return 0;
}
輸出:
[cfati@CFATI-5510-0:e:WorkDevStackOverflowq069197545]> sopr.bat
###設定更短的提示,以便在StackOverflow(或其他)頁面中粘貼時更合適 ###
[prompt]> "c:Installpc032MicrosoftVisualStudioCommunity2019VCAuxiliaryBuildvcvarsall.bat" x64 > nul
[提示]> dir /b
dll00.c
dll00.h
lib00.c
lib00.h
main00.c
[提示]> :: 構建.dll(1步)
[prompt]> cl /nologo /MD /DDLL dll00.c /link /NOLOGO /DLL /OUT:dll00.dll
dll00.c
創建庫dll00.lib和物件dll00.exp
[提示]> :: 建立.lib(2個步驟)。
[prompt]> cl /c /nologo /MD /Folib00.obj lib00.c
lib00.c
[提示]> lib /NOLOGO /OUT:lib00.lib lib00.obj
[提示]> :: 構建.exe(1步)
[prompt]> cl /nologo /MD /W0 main00.c /link /NOLOGO /OUT:main00_pc064.exe lib00.li dll00.lib
main00.c
[提示]> 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回傳:-6
完成了。
因此,它起作用了(至少是這個微不足道的例子)。
正如所見,在構建.exe時,我也將.dll的.lib傳遞給了聯結器(意味著.dll(連同其所有(經常出現的)依賴)在運行時需要)。關于如何在VStudio專案上進行操作的資訊,請查看[SO]:如何在Visual Studio中包含OpenSSL(@CristiFati的回答)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/310703.html
標籤:
