Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual Studio Android正在将程序集文件构建到应用程序中_Android_Visual Studio_Assembly_Ld_Unix Ar - Fatal编程技术网

Visual Studio Android正在将程序集文件构建到应用程序中

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++编

我们有一个visualstudioandroid解决方案,其中包括一个静态库项目,其中包含在汇编中实现的功能。比如:

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