這可能是由於缺乏C++/cli知識而導致的,但我似乎無法在任何地方找到此問題。將本地類添加到託管項目
我有一個名爲ManagedProject的項目,它使用/ CLR進行編譯,並且有一個名爲RefClass.cpp的(C++/cli)ref類和一個名爲CppClass.cpp的本機C++類。
我可以從RefClass調用CppClass的構造函數。
但是,我無法從另一個也使用/ clr編譯的項目「OtherProject」中調用CppClass。 OtherProject只有Other.cpp。 OtherProject有一個對ManagedProject的引用,所以我可以調用RefClass,但即使我能夠#include「CppClass.h」,當我嘗試調用CppClass的構造函數時,也會得到LNK2019和LNK2028錯誤。
從non/clr本機類中調用它時會出現相同的錯誤。
下面是一個代碼示例:
ManagedProject
RefClass.cpp:
// has a .h file with the constructor declaration & instance variable int test;
#include "CppClass.cpp"
RefClass:RefClass(int test){
this->test = test;
CppClass inst(42); //This works
}
CppClass.cpp:
// has a .h file with the constructor declaration & instance variable int test2;
CppClass:CppClass(int test2){
this->test2 = test2;
}
OtherProject
Other.cpp:
#include "CppClass.cpp"
int wmain(/*args*/){
RefClass^ refinst = gcnew RefClass(64); //This works
CppClass inst(42); //This fails, I get LNK2019 & LNK2028 at Other.obj
}
實際的錯誤輸出: 注:此處SQLPrecheckReport是CppClass和appzsqlmigrate.cpp是Other.cpp,appzsqlmigrate是名OtherProject。
32> appzsqlmigrate.obj:錯誤LNK2028:無法解析的令牌(0A000B59) 「公共:__cdecl SQLPrecheckReport :: SQLPrecheckReport(INT)」 (?? 0SQLPrecheckReport @@ $$ FQEAA 3 H @ Z)中引用函數 「INT __cdecl wmain(INT,wchar_t的* *常量)」(wmain @@ $$ HYAHHQEAPEA_W @ Z?)
32> appzsqlmigrate.obj:錯誤LNK2028:無法解析的令牌(0A000B5A) 「公共:__cdecl SQLPrecheckReport (int,wchar_t * * const)「(?wmain @@ $$ HYAHHQEAP)中引用的」::〜SQLPrecheckReport(void)「 (?? 1SQLPrecheckReport @@ $$ FQEAA @ XZ) EA_W @ Z)
32> appzsqlmigrate.obj:錯誤LNK2019:解析外部符號 「公共:__cdecl SQLPrecheckReport :: SQLPrecheckReport(INT)」 (?? 0SQLPrecheckReport @@ $$ FQEAA 3 H @ Z)中引用函數 「INT __cdecl wmain(INT,wchar_t的* *常量)」(wmain @@ $$ HYAHHQEAPEA_W @ Z?)
32> appzsqlmigrate.obj:錯誤LNK2019:解析外部符號 「公共:__cdecl SQLPrecheckReport :: 〜SQLPrecheckReport(void)「 (??1SQLPrecheckReport @@ $$ FQEAA @ XZ)在函數引用爲 「int __cdecl wmain(INT,wchar_t的* *常量)」(?wmain @@ $$ HYAHHQEAPEA_W @ Z)
CLR爲模塊提供了出色的支持,但它不會追溯地將該支持添加到非託管代碼中。你必須在這裏做普通的C++舞蹈,並把C++類放在一個普通的靜態庫或DLL項目中,並鏈接它們的.libs,以便可以共享本地代碼。 –
@HansPassant,我現在看到這個問題不需要用C++/cli。很抱歉,如果這看起來很明顯,我完全不熟悉使用dll和庫。你能給我說明嗎?「把C++類放在一個普通的靜態庫或DLL項目中,並鏈接它們的.libs,以便可以共享本地代碼」?我迄今爲止所嘗試的解決方案沒有解決錯誤... –