0

我有一个巨大的 99% 的c#Visual Studio 解决方案,其中包含许多c#项目,并且只有一个c++项目在构建时产生一个 dll(在需要的地方复制),由一个c#dll 包装和编组,然后由解决方案中的许多其他项目使用. 解决方案的配置管理器的属性是:

  • 对于任何配置(调试或发布),平台对于所有c#项目都是“任何 CPU”
  • 对于c++项目,对于任何配置,平台都是 x64

第二点有一个很好的转折:c++项目的vcproj结尾包含以下内容:

<Target Name="AfterBuild">
  <MSBuild Condition=" '$(Platform)' == 'x64' " Projects="$(MSBuildProjectFile)" Properties="Platform=Win32;PlatFormTarget=Win32" RunEachTargetSeparately="true" />
</Target>

c++根据上面的第二点,每次在 x64 中构建时,都会在 x86 和 x64 中构建(对于给定的配置)。

这自然是有争议的,具有挑战性的,但是在构建服务器等的生产环境中可以完美运行多年,并且不能在没有副作用的情况下对数十人进行修改。准确地说,在 prod 中,c++ 项目产生了一个c++其他c#项目(也产生 nugt 包)引用的 nuget 包。

我在其中的角色?我在 c++ 中评论了几个问题,更正了所有问题,并希望推动我的更正。问题是c++代码仅通过测试进行c#测试,并且每次测试运行时都需要加载大量数据,或者至少加载一个大量数据和模拟,而在c++我已经拥有执行测试所需的所有序列化文件.

因此,我创建了一个c++测试项目(Visual Studio 中的 C++ 单元测试项目),在其中引用了原始c++项目,c++在需要的地方复制原始项目的 dll 以使c++测试项目顺利运行,设置测试项目(适用于任何配置)构建在 x64 中(在配置管理器中)并在其vcproj文件中添加了与原始文件相同的“AfterBuild”位c++(如上所示)。

但是,这给了我构建错误:

1>------ Build started: Project: Pricer.functionaltests, Configuration: Debug x64 ------
1>cpptestproject.vcxproj -> path\to\cpptestproject\x64\Debug\Pricer.functionaltests.dll
1>cpptestproject.vcxproj -> path\to\cpptestproject\x64\Debug\Pricer.functionaltests.pdb (Partial PDB)
1>   Creating library path\to\cpptestproject\Debug\Pricer.functionaltests.lib and object path\to\cpptestproject\Debug\Pricer.functionaltests.exp
1>cpptestproject.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) bool __cdecl SOMENAMESPACE::Function1(char * *,char * *,bool,bool,char * *)" (__imp_?Function1@SOMENAMESPACE@@YA_NPAPAD0_N10@Z) referenced in function "public: void __thiscall cpptestproject::cpptestproject::BulkTest(void)" (?BulkTest@cpptestproject@1@QAEXXZ)
1>cpptestproject.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) bool __cdecl SOMENAMESPACE::Function2(char * *,char * *,bool,bool,char * *)" (__imp_?Function2@SOMENAMESPACE@@YA_NPAPAD0_N10@Z) referenced in function "public: void __thiscall cpptestproject::cpptestproject::BulkTest(void)" (?BulkTest@cpptestproject@1@QAEXXZ)
1>cpptestproject.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) bool __cdecl SOMENAMESPACE::Function3(char * *,long,char * *,bool,char * *,bool,char * *,bool,char * *,bool)" (__imp_?Function3@SOMENAMESPACE@@YA_NPAPADJ0_N010101@Z) referenced in function "public: void __thiscall cpptestproject::cpptestproject::BulkTest(void)" (?BulkTest@cpptestproject@1@QAEXXZ)
1>cpptestproject.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) bool __cdecl SOMENAMESPACE::Function4(char * *)" (__imp_?Function4@SOMENAMESPACE@@YA_NPAPAD@Z) referenced in function "public: void __thiscall cpptestproject::cpptestproject::BulkTest(void)" (?BulkTest@cpptestproject@1@QAEXXZ)
1>path\to\originalcpproject\build\bin\x64\Debug\Pricer.x64.lib : warning LNK4272: library machine type 'x64' conflicts with target machine type 'X86'
1>path\to\cpptestproject\Debug\cpptestproject.dll : fatal error LNK1120: 4 unresolved externals
1>Done building project "cpptestproject.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

如果我将测试项目(对于任何配置)设置为在 x86(在配置管理器中)而不是 x64 中构建并从其vcproj.

我试图实现的是,像对初始c++项目所做的那样(通过在配置管理器中强制 x64 + 文件中的“AfterBuild”位vcproj),确保c++测试项目的构建方式与原始c++项目相同,同时引用它。我不知道这是否可能。

4

0 回答 0