当使用直接添加到应用程序项目的本机库时,如果我们将构建操作设置为None
,但设置&#34;始终复制到输出文件夹&#34;,则静态本机库似乎被复制到预期的Caches文件夹(例如:/Users/<uname>/Library/Caches/Xamarin/mtbs/builds/<app-name>/<identifier>/
),然后通过${ProjectDir}
env-var链接到mTouchExtraArgs。可以通过Xamarin.Apple.Sdk.targets
中的步骤看到这一点。
<!-- For backwards compatibility, we also copy the None items with CopyToOutput to the root build directory in the mac -->
<_NoneWithCopyToOutputDirectory Include="@(_NoneWithTargetPath)" Condition="'%(_NoneWithTargetPath.CopyToOutputDirectory)' != ''" />
这包括最终的.app包中的.a文件我想这会成为一个单独的问题,但这至少可以让应用程序正常工作。
但是,如果我类似地通过nuget包MSBuild目标文件向iOS项目添加本机文件,则不会将其复制到构建缓存根文件夹(尝试将文件项类型设置为Content并且结果相同)。虽然它仍然被转移到<cache folder path>/bin/iPhone/Debug/device-builds/iphone7.2-11.0.2/
文件夹(猜测作为Always copy to output标志的一部分),这是应用程序的.app似乎也在其中。
我正在寻找将此路径传递给mTouchExtraArgs的方法。
注意:问题与iPhoneSimulator不存在,因为输出路径仅为<cache folder>/bin/iPhoneSimulator/Debug
,因此我只能使用${ProjectDir}/bin/$(Platform)/$(Configuration)/mylib.a
,让它在模拟器中运行。它链接很好,然后按预期工作。
对于设备而言,路径的最后一部分是基于设备的动态,不知道我如何向链接器指示该值。任何帮助都会很棒。
使用Visual Studio(2017年15.3.5)和最新稳定的Xamarin.iOS(11.0),Xamarin(4.7.9.45),如果有帮助的话。
答案 0 :(得分:1)
那些方向是&#34;小&#34;过时的;-)
将框架或静态/动态库添加为&#34; Native Reference&#34;并设置其mtouch/gcc_flags
属性。这可以通过将框架目录或库拖放到Native Reference
项目的Xamarin.iOS
组中来完成。
然后,您可以设置库的 Kind
的属性:框架,静态或动态。
如果您知道现有的&#34;链接&#34;中的gcc链接选项和稍微,则其他属性相当不言自明。文档:
这将在项目中生成自定义ItemGroup
/ NativeReference
,Xamarin.iOS
MSBuild目标将被解析并转发到mtouch
。
来自SushiHangover.SVGKit的示例:
<ItemGroup>
<NativeReference Include="..\SVGKit\DerivedData\SVGKit-iOS\Build\Products\Release-universal\libSVGKit-iOS.2.0.0.a">
<Kind>Static</Kind>
<ForceLoad>True</ForceLoad>
<Frameworks>CocoaLumberjack CoreText CoreImage QuartzCore CoreGraphics</Frameworks>
<LinkerFlags>-lxml2</LinkerFlags>
</NativeReference>
<NativeReference Include="..\SVGKit\3rd-party-frameworks\CocoaLumberjack-2.2.0\iOS\CocoaLumberjack.framework">
<Kind>Framework</Kind>
<ForceLoad>True</ForceLoad>
</NativeReference>
</ItemGroup>