【问题标题】:Unable to link native library in MonoTouch project - library not found for -lName无法链接 MonoTouch 项目中的本机库 - 未找到 -lName 的库
【发布时间】:2014-09-17 03:19:13
【问题描述】:

我已经在 xcode 中编译了flacios library。然后我从框架文件夹中提取了一个“胖二进制文件”(为这个特定的 xcode 项目构建工件)并将其重命名为 libFLACiOS.a。

然后我将它添加到 MonoTouch 应用程序项目中。创建了一个 NativeMethods 包装类,我在其中导入了我需要使用的本地方法,并在项目选项中添加了一个 gcc 标志:

-cxx -gcc_flags "-std=c++11 -stdlib=libc++ -lc++ -v -Wall -L${ProjectDir} -lFLACiOS -framework AVFoundation -force_load ${ProjectDir}/libFLACiOS.a

现在,我似乎已经完成了导入工作所需的一切,但是当我尝试构建项目时,出现以下构建错误:

/Developer/MonoTouch/usr/bin/mtouch -sdkroot "/Applications/Xcode.app/Contents/Developer" --cache "/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache" --nomanifest --nosign -dev "/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/bin/iPhone/Debug/Sigmo.app" -r "/Developer/MonoTouch/usr/lib/mono/2.1/System.dll" -r "/Developer/MonoTouch/usr/lib/mono/2.1/System.Xml.dll" -r "/Developer/MonoTouch/usr/lib/mono/2.1/System.Core.dll" -r "/Developer/MonoTouch/usr/lib/mono/2.1/monotouch.dll" -debug -linksdkonly -sdk "7.1" -targetver "7.0" --abi=armv7 "-cxx" --gcc_flags "\"-std=c++11\" \"-stdlib=libc++\" \"-lc++\" \"-v\" \"-Wall\" \"-L/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo\" \"-lFLACiOS\" \"-framework\" \"AVFoundation\" \"-force_load\" \"/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/libFLACiOS.a\"" "/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/bin/iPhone/Debug/Sigmo.exe"
Xamarin.iOS 7.2.5 Trial Edition using framework: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk
Process exited with code 1, command:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++  -Wl,-pie  -miphoneos-version-min=7.0 -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk  /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/Sigmo.exe.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/monotouch.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/mscorlib.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/System.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/System.Core.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/registrar.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/main.armv7.o -o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/bin/iPhone/Debug/Sigmo.app/Sigmo -framework CFNetwork -framework AVFoundation -framework QuartzCore -framework CoreBluetooth -framework Foundation -framework AudioToolbox -framework CoreGraphics -framework UIKit -lz -liconv -u _mono_pmip -u _monotouch_release_managed_ref -u _monotouch_create_managed_ref -u _xamarin_get_block_descriptor -u _monotouch_IntPtr_objc_msgSend_IntPtr -u _monotouch_log /Developer/MonoTouch/SDKs/MonoTouch.iphoneos.sdk/usr/lib/libmonoboehm-2.0.a /Developer/MonoTouch/SDKs/MonoTouch.iphoneos.sdk/usr/lib/libmonotouch-debug.a "-std=c++11" "-stdlib=libc++" "-lc++" "-v" "-Wall" "-L/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo" "-lFLACiOS" "-framework" "AVFoundation" "-force_load" "/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/libFLACiOS.a"
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: arm-apple-darwin13.3.0
Thread model: posix
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch armv7 -force_load /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/libFLACiOS.a -iphoneos_version_min 7.0.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk -u _mono_pmip -u _monotouch_release_managed_ref -u _monotouch_create_managed_ref -u _xamarin_get_block_descriptor -u _monotouch_IntPtr_objc_msgSend_IntPtr -u _monotouch_log -o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/bin/iPhone/Debug/Sigmo.app/Sigmo -L/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo -pie /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/Sigmo.exe.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/monotouch.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/mscorlib.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/System.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/System.Core.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/registrar.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/main.armv7.o -framework CFNetwork -framework AVFoundation -framework QuartzCore -framework CoreBluetooth -framework Foundation -framework AudioToolbox -framework CoreGraphics -framework UIKit -lz -liconv /Developer/MonoTouch/SDKs/MonoTouch.iphoneos.sdk/usr/lib/libmonoboehm-2.0.a /Developer/MonoTouch/SDKs/MonoTouch.iphoneos.sdk/usr/lib/libmonotouch-debug.a -lc++ -lFLACiOS -framework AVFoundation -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/lib/darwin/libclang_rt.ios.a
Undefined symbols for architecture armv7:
  "std::string::c_str() const", referenced from:
      FLAC::Decoder::File::init(std::string const&) in libFLACiOS.a(stream_decoder-823A661D997F1576.o)
      FLAC::Decoder::File::init_ogg(std::string const&) in libFLACiOS.a(stream_decoder-823A661D997F1576.o)
      FLAC::Encoder::File::init(std::string const&) in libFLACiOS.a(stream_encoder-20FCC1D902B5C661.o)
      FLAC::Encoder::File::init_ogg(std::string const&) in libFLACiOS.a(stream_encoder-20FCC1D902B5C661.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

error MT5309: Native linking error: Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
error MT5309: Native linking error: Target: arm-apple-darwin13.3.0
error MT5309: Native linking error: Thread model: posix
error MT5309: Native linking error: "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch armv7 -force_load /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/libFLACiOS.a -iphoneos_version_min 7.0.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk -u _mono_pmip -u _monotouch_release_managed_ref -u _monotouch_create_managed_ref -u _xamarin_get_block_descriptor -u _monotouch_IntPtr_objc_msgSend_IntPtr -u _monotouch_log -o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/bin/iPhone/Debug/Sigmo.app/Sigmo -L/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo -pie /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/Sigmo.exe.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/monotouch.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/mscorlib.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/System.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/System.Core.dll.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/registrar.armv7.o /Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/obj/iPhone/Debug/mtouch-cache/main.armv7.o -framework CFNetwork -framework AVFoundation -framework QuartzCore -framework CoreBluetooth -framework Foundation -framework AudioToolbox -framework CoreGraphics -framework UIKit -lz -liconv /Developer/MonoTouch/SDKs/MonoTouch.iphoneos.sdk/usr/lib/libmonoboehm-2.0.a /Developer/MonoTouch/SDKs/MonoTouch.iphoneos.sdk/usr/lib/libmonotouch-debug.a -lc++ -lFLACiOS -framework AVFoundation -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/lib/darwin/libclang_rt.ios.a
error MT5210: Native linking failed, undefined symbol: std::string::c_str() const. Please verify that all the necessary frameworks have been referenced and native libraries are properly linked in.
error MT5201: Native linking failed. Please review the build log and the user flags provided to gcc: "-std=c++11" "-stdlib=libc++" "-lc++" "-v" "-Wall" "-L/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo" "-lFLACiOS" "-framework" "AVFoundation" "-force_load" "/Users/maxpavlov/Perforce/max.pavlov_Moment_5440/Mobile/Sigmo/SigmoIOS/Sigmo/libFLACiOS.a"
error MT5202: Native linking failed. Please review the build log.

【问题讨论】:

    标签: binding xamarin.ios xamarin native


    【解决方案1】:

    您似乎在告诉本机链接器链接FLAC.a,因为-lFLAC

    但是你说FLACiOS.a 存在,这是一个不同的文件名。您是否尝试将其更改为匹配,即-lFLACiOS

    【讨论】:

    • 谢谢。我不知道 -l 参数必须包含没有 .a 扩展名的库名称。但是,将 gcc 标志更改为 -lFLACiOS 并没有改变任何东西 - 我仍然收到相同的错误消息。我更新了错误消息以显示即使使用 -lFLACiOS 也是如此。
    • 事实上,Xamarin 文档基本上指出,如何调用 -l 库并不重要。在他们的示例中,gcc 参数是 -gcc_flags "-L${ProjectDir} -lMylibrary -force_load ${ProjectDir}/libMyLibrary.a" 而 MyLibrary 不是 libMyLibrary literatly。
    • 这不是文档所说的 ;-) lib 前缀是隐含的,但不需要 IIRC(您可能希望将其重命名为 100% 确定)。
    • 嗯,我做到了,但没有帮助。请更新我在问题文本中提供的错误日志,也许我重命名了错误。
    • 您可能对命名约定是正确的。由于现在我得到了一个不同的错误,并且 lib not found 消失了,最初的问题来源是命名。抱歉,我现在更改了问题的上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多