【发布时间】:2018-06-07 01:51:41
【问题描述】:
我正在考虑在 Windows 10 上使用 C++ 和汇编语言。我从桌面上的 x64 asm 开始,然后我想在 Win 10 IOT Core 上尝试 ARM asm。
该项目通常包含大量 C++ 代码和一些汇编语言代码,但我会看到它的去向。为什么要使用汇编?纯粹是为了好玩。整个项目是一种重新回到 C++ 和汇编的爱好。
UWP C++ 似乎是要走的路,即最新的 Microsoft 编程技术。仍然支持 Windows 桌面 C++(即 Win32 或控制台),但我宁愿坚持使用 UWP。
我快速阅读了 UWP C++,没有学习 XAML 的基础知识,而 C++ 又回到了我的身边(我已经好几年没接触过它了)。
使用 Visual Studio Professional(引擎盖下带有 masm)和 x64 asm。
我有一个简单的 Hello World 应用程序。一个文本框和一个按钮。该项目包括一个 .asm 文件,其中包含一个简单的函数,该函数将两个数字相加并以 rax 形式返回结果。这个(asm)函数在按钮点击事件中被调用并输出到文本框文本。
MainPage.xaml.cpp
extern "C" int SomeFunction();
void LearningUWPwithCPP::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
greetingOutput->Text = SomeFunction().ToString();
}
MainPage.xaml
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel x:Name="contentPanel" Margin="120,30,0,0">
<TextBlock HorizontalAlignment="Left" Text="Hello World" FontSize="36"/>
<TextBlock Text="Click the button"/>
<Button x:Name="inputButton" Content="Click me" Click="Button_Click"/>
<TextBlock x:Name="greetingOutput"/>
</StackPanel>
</Grid>
TestASM.asm
.CODE
SomeFunction PROC
mov rax, 5
add rax, 6
ret
SomeFunction ENDP
END
更多信息...
- Project Build Dependencies 已选中 masm 选项(即打开)。
- UWP C++ 编译为本机代码,因此它应该接受 asm 文件
- 不幸的是,关于 UWP 和 asm 的信息似乎不存在(这并不奇怪)
问题:我收到“未解决的外部”错误
有用的提示
- Intellisense 提示找不到我的 (asm) 函数的 extern 声明中的函数定义。
- 我可以在 asm 文件中输入任何垃圾,项目将成功编译。
有了这些点,很明显该项目没有找到我的 asm 文件。我不确定如何包含 asm 文件。而且我怀疑 extern 是 Win32 C++ 时代的残余,也许不能在 UWP 中使用。
非常感谢任何帮助。
【问题讨论】:
-
尝试在解决方案资源管理器中查看您的 asm 文件的属性。具体来说,您正在查看
Excluded from Build是否设置为 yes 或Item Type是否设置为 Microsoft Macro Assembler 以外的其他值。 -
@DavidWohlferd 就是这样!!!问题是这两个属性都设置为空白。适当地设置这些(如您所建议的)修复它。太感谢了!我花了半天时间寻找并尝试了一堆东西。请发表您的评论作为答案,我会将其标记为正确。
-
您通常不必使用
_SomeFunction作为函数的asm 名称来链接Windows 上的编译器生成的代码吗?还是 MS 的汇编程序会为您进行名称修改?或者 UWP 是否包含一个新的 ABI,其中 C 和 C++ 符号名称在目标文件中根本不以_为前缀? -
UWP 并不是真正的“最新的微软技术”,它只是 C++ 桌面的一个残缺版本。使用 UWP 的原因是您可以在 Windows 10 商店中销售您的应用程序。
-
@RossRidge 根据我的阅读,UWP 是最新的版本。微软在几年内创建了 Metro Apps (Win8)、WinRT (Win 8.1) 和 UWP (Win10)。 UWP 包括 Win32 和 WinRT API(和其他 API)。此外,我最近了解到 UWP 中的“通用”意味着开发人员可以跨不同硬件(PC、手机、Xbox、物联网......)访问相同的 API,但该应用程序不一定可以在任何地方运行。根据硬件,API 的子集也可用——我要阅读更多内容。 C++ 桌面的残缺版本?你的意思是进行中的工作吗?可能。令人困惑?当然是!