Visual Studio Android正在将程序集文件构建到应用程序中
我们有一个visualstudioandroid解决方案,其中包括一个静态库项目,其中包含在汇编中实现的功能。比如:Visual Studio Android正在将程序集文件构建到应用程序中,android,visual-studio,assembly,ld,unix-ar,Android,Visual Studio,Assembly,Ld,Unix Ar,我们有一个visualstudioandroid解决方案,其中包括一个静态库项目,其中包含在汇编中实现的功能。比如: my.S -> libMine.a -> libMyApp.so 一些环(如下)已经被跳过,以便编译。然后,主应用程序共享库项目的链接失败(在我们关心的-x64和arm64两种架构上),对[assembly]文件中实现的函数的引用未定义 Visual Studio(或其跨平台Mobile Dev/Android插件)似乎没有正确处理程序集文件项目项-作为C/C++编
my.S -> libMine.a -> libMyApp.so
一些环(如下)已经被跳过,以便编译。然后,主应用程序共享库项目的链接失败(在我们关心的-x64和arm64两种架构上),对[assembly]文件中实现的函数的引用未定义
Visual Studio(或其跨平台Mobile Dev/Android插件)似乎没有正确处理程序集文件项目项-作为C/C++编译器文件处理,它将在第一个点字符(即.text
)中出错;Microsoft宏汇编程序“在此平台上不受支持”。因此,我考虑使用以下命令设置自定义构建步骤:
$(ClangToolExe) %(FullPath) --target=$(ClangTarget) -g -o $(IntDir)%(FileName).o
这将进行预处理、编译和链接-但是使用了错误的链接器:而不是针对特定Android工具链的链接器,而是针对我的MinGW安装中的链接器,它不识别仿真模式-无论如何,这不是我的NDK工具链的位置
我们现在可以跳过对象的链接(将-c
添加到上述命令)。让我们非常失望的是,结果对象文件仍然没有添加到静态库中,正如{toolchain path的其余部分}ar t libMine.a
所确认的那样。实际上,库中的函数将有未定义的符号,如{toolchain path的其余部分}objdump-t libMine.a
所示
作为构建后的一个步骤,让我们非常手动地将对象文件添加到生成的库中。命令:
$(ToolChainPrebuiltPath){Rest of the toolchain path}ar.exe ru $(TargetPath) $(IntDir)my.o
objdump-t libMine.a
现在将显示我们已经获得了符号。但是,也有“UND”定义的对
快进:
- 使用引用MyFunctions.o libMine.a的其他对象添加
,以便在未定义的符号之前显示良好的符号不会产生任何影响my.o
- 将已编译的程序集文件与第二个自定义生成步骤链接,
不会产生有意义的区别$(ToolChainPrebuiltPath){toolchain路径的其余部分}ld.exe$(IntDir)%(FileName).o-o$(IntDir)%(FileName).o
- 在静态库上再次运行链接器,作为生成后的第二步
,不会产生有意义的区别$(ToolChainPrebuiltPath){工具链路径的其余部分}ld.exe$(TargetPath)
- 最后两个步骤会导致关于缺少符号的警告_start(入口点?)。我猜这是指链接一个可执行文件,这是我们不想要的
我做错了什么?如何解析这些未定义的引用?似乎有效的方法是: 1,确保程序集文件的扩展名为
.S
,即大写字母S。这是我发现的少数几个实例之一,其中文件名的大小写在Windows上很重要
2、配置项目,以便使用clang.exe{full/path/to/assembly.S,即%(FullPath)}-c--target=$(ClangTarget)-g-o$(IntDir)%(FileName).o构建程序集文件。在VS Android的情况下,我们需要单独指定构建输出,即$(IntDir)%(FileName).o部分
3,作为生成后命令运行ar
:{correct toolchain}/ar.exe rus$(TargetPath){output from assembly compilation}
,用于每个程序集文件
此解决方案缺少的一点是检测到[缺少]更改,这意味着程序集文件将在每次编译以及依赖于它的所有内容上重建。gcc/clang在Windows上的工作方式与在Unix/Linux上的工作方式相同clang-cfoo.S
在将其提供给汇编程序之前,通过c预处理器运行它.s
没有。对于手工编写的asm源代码,使用.S
,对于编译器生成的asm,使用.S
(如从gcc-save temps
或gcc-S foo.c
)