在Visual Studio Mac解决方案(Xamarin.Mac应用程序)中使用C / C ++库?

时间:2017-05-24 11:40:14

标签: c++ xamarin.mac visual-studio-mac

Xamarin.Mac和C ++

我正在尝试在Visual Studio for Mac中使用C ++库(.a)(a.k.a. Xamarin) 我在网上找到了一些关于在Xamarin(https://developer.xamarin.com/guides/ios/advanced_topics/native_interop/)中链接本地库的信息,但是因为Visual Studio for Mac已经用完了所以它已经过时了。

我将这两个项目上传到https://github.com/dawmster/XamarinAndCpp

目录

  1. MyCppLib - 生成libMyCppLib.a的XCode项目
  2. XamarinMacApp - Visual Studio For Mac解决方案
  3. libMyCppLib.a - 这是MyCppLib的产品,XamarinMacApp引用它。
  4. 什么是好的

    MyCppLib 编译正常并生成libMyCppLib.a 我打算只导出两个C函数(my_C_Function, my_second_C_Function - MyCppLib.cpp),但我无法删除其他sybols - 这似乎是问题的根源

    extern "C" {
            int my_C_Function();
            int my_second_C_Function();
    }
    

    在XamarinMacApp中引用libMyCppLib.a(添加到解决方案中)。 并在AppDelegate.cs中调用my_C_Function,如下所示:

    using System.Runtime.InteropServices;
    
    namespace XamarinMacApp
    {
    
        [Register("AppDelegate")]
        public class AppDelegate : NSApplicationDelegate {
    
            public AppDelegate(){}
    
            [DllImport("__Internal")]
            static extern int my_C_Function();
            public override void DidFinishLaunching(NSNotification notification)
            {
                int myretval = my_C_Function();
            }
    
            public override void WillTerminate(NSNotification notification)
            {
                // Insert code here to tear down your application
            }
        }
    }
    

    什么不行

    XamarinMacApp - 无法编译并出现以下错误:

    请注意,C函数(my_C_Function, my_second_C_Function未在下面的错误中列出)。 似乎只有C ++标准库无法链接。

    Full Visual Studio Mac compiler log.

    Full Xcode compiler log

    Undefined symbols for architecture x86_64:
          "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
              l004 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::ios_base::getloc() const", referenced from:
              l004 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)", referenced from:
              l007 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from:
              l007 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::basic_ostream<char, std::__1::char_traits<char> >::put(char)", referenced from:
              l004 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from:
              l004 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::cout", referenced from:
              l002 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::ctype<char>::id", referenced from:
              l004 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::locale::~locale()", referenced from:
              l004 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::__1::ios_base::clear(unsigned int)", referenced from:
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "std::terminate()", referenced from:
              l008 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "operator delete(void*)", referenced from:
              l001 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "operator new(unsigned long)", referenced from:
              l001 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "___cxa_begin_catch", referenced from:
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
              l008 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "___cxa_end_catch", referenced from:
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
          "___gxx_personality_v0", referenced from:
              l004 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
              l005 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
              l007 in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
              Dwarf Exception Unwind Info (__eh_frame) in libMyCppLib.a(libMyCppLib.a-x86_64-master.o)
        ld: symbol(s) not found for architecture x86_64
        clang : error : linker command failed with exit code 1 (use -v to see invocation)
    
        MMP : error MM5109: Native linking failed with error code 1.  Check build log for details.
    Done building target "_CompileToNative" in project "XamarinMacApp.csproj" -- FAILED.
    
    Done building project "XamarinMacApp.csproj" -- FAILED.
    

    任何想法如何前进?

0 个答案:

没有答案