[英]How do I correctly reference a private Windows assembly in the Application Manifest?
我的项目设置为使用CMake , Ninja作为我的生成器, MSVC作为我的编译器。 我有一个可执行目标A.exe
和 2 个共享库目标( B.dll
和C.dll
)。 我在 Windows 上并通过链接到他们的 static 对应B.lib
和C.lib
来使用加载时链接。 此目标的依赖关系如下: A.exe
-> B.dll
-> C.dll
(将“->”读作“取决于”)。
一切都成功编译和构建,但是当我尝试运行程序时出现此错误:
The Application has failed to start because its side to side configuration is incorrect
我项目的基本文件夹结构:
\
| - A.cpp
| - B.cpp
| - C.cpp
| - A.manifest
| - B.manifest
| - C.manifest
| - CMakeListst.txt
cmake_minimum_required(VERSION 3.22.0)
project(test VERSION 0.1.0)
add_executable(
A
"A.cpp"
"A.manifest"
)
add_library(
B
SHARED
"B.cpp"
"B.manifest"
)
add_library(
C
SHARED
"C.cpp"
"C.manifest"
)
target_link_libraries(B C) # B -> C
target_link_libraries(A B) # A -> B
A.cpp:
__declspec(dllimport) void B_test();
int main()
{
B_test();
return 0;
}
B.cpp:
__declspec(dllimport) void C_test();
__declspec(dllexport) void B_test()
{
C_test();
}
C.cpp:
#include <iostream>
__declspec(dllexport) void C_test()
{
std::cout << "Success" << std::endl;
}
A.清单:
<?xml version="1.0" encoding="UTF-8"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0"
>
<assemblyIdentity
type="win32"
name="A"
language="*"
processorArchitecture="amd64"
version="1.0.0.0"
/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="B"
language="*"
processorArchitecture="amd64"
version="1.0.0.0"
/>
</dependentAssembly>
</dependency>
</assembly>
B.清单:
<?xml version="1.0" encoding="UTF-8"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0"
>
<assemblyIdentity
type="win32"
name="B"
language="*"
processorArchitecture="amd64"
version="1.0.0.0"
/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="C"
language="*"
processorArchitecture="amd64"
version="1.0.0.0"
/>
</dependentAssembly>
</dependency>
<file name="B.dll" />
</assembly>
C.清单:
<?xml version="1.0" encoding="UTF-8"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0"
>
<!-- details about our side-by-side assembly-->
<assemblyIdentity
type="win32"
name="C"
language="*"
processorArchitecture="amd64"
version="1.0.0.0"
/>
<file name="C.dll" />
</assembly>
C.manifest
实际上并不是必需的,所有.dll
文件都应该在B.manifest
中引用,但这也不起作用。 我想要的是让我的A.exe
依赖于B.dll
,它也依赖于C.dll
。 我想知道我哪里错了,我该怎么做才能实现我的目标。
在其他程序员的帮助下,在评论中添加和删除.manifest
文件中的一些行,我终于让它工作了。 感谢西蒙穆里埃
A 应该声明 B 和 C dll – Simon Mourier
我的错误是将我的B.dll
和C.dll
声明为单独的私有程序集。 事实上,我必须做的是将<file>
标签添加到A.manifest
中,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0"
>
<assemblyIdentity
type="win32"
name="A"
language="cpp"
processorArchitecture="amd64"
version="1.0.0.0"
/>
<!-- Added the .dll's to application manifest -->
<file name="B.dll" />
<file name="C.dll" />
</assembly>
此外,不再需要B.manifest
和C.manifest
,我将它们排除在构建之外:
cmake_minimum_required(VERSION 3.22.0)
project(test VERSION 0.1.0)
add_executable(
A
"A.cpp"
"A.manifest"
)
# removed "B.manifest"
add_library(
B
SHARED
"B.cpp"
)
# removed "C.manifest"
add_library(
C
SHARED
"C.cpp"
)
target_link_libraries(B C) # B -> C
target_link_libraries(A B) # A -> B
有了它,一切正常并且输出正确
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.