代码之家  ›  专栏  ›  技术社区  ›  Arnaud F.

在C++/CLI中调用非托管g++.lib

  •  0
  • Arnaud F.  · 技术社区  · 11 年前

    是否可以包装在C++/CLI中使用g++编译的静态库?

    这是我的尝试:

    非托管C++

    #include <string>
    
    class Person
    {
    public:
       Person(void);
       ~Person(void);
       void Print(std::string, std::string);
    };
    

    C++/CLI语言

    #pragma once    
    #include <Person.h>
    #pragma comment (lib, "VS-Person.lib")
    //#pragma comment (lib, "GPPPerson.lib")
    
    namespace CppWrapper {
        public ref class PersonWrapper {
        private:
              Person* m_person;
        protected:
        public:
            PersonWrapper(); // Doing 'm_person = new Person();'
            ~PersonWrapper();
        };
    }
    

    我的想法是,当使用在VS2010解决方案(VSPerson.lib)中编译的lib时,它可以完美地工作,但当使用使用g++(GPPPerson.lib)编译的lib,我得到了以下错误:

    error LNK2028: jeton non résolu (0A00032D) "public: __thiscall Person::Person(void)" (??0Person@@$$FQAE@XZ) référencé dans la fonction "public: __clrcall CppWrapper::PersonWrapper::PersonWrapper(void)" (??0PersonWrapper@CppWrapper@@$$FQ$AAM@XZ)
    error LNK2019: symbole externe non résolu "public: __thiscall Person::Person(void)" (??0Person@@$$FQAE@XZ) référencé dans la fonction "public: __clrcall CppWrapper::PersonWrapper::PersonWrapper(void)" (??0PersonWrapper@CppWrapper@@$$FQ$AAM@XZ)
    

    我错过什么了吗? 如何在C++/CLI中包装使用g++编译的非托管库?

    谢谢

    1 回复  |  直到 11 年前
        1
  •  2
  •   Seva Alekseyev    11 年前

    这是不可能的。G++和Visual C++对对象/库文件有着截然不同的期望。可以在Visual C++中重新编译非托管部分并链接到该部分。

    或者,您可以在G++和P/Invoke中构建一个DLL,该DLL来自C++/CLI。

    编辑:因为它是一个C++库(与C相反),所以双重不可能。G++和Visual C++不会就名称篡改达成一致;因此在链接/动态加载时没有一个C++符号匹配。

    也就是说,你一开始为什么要这么做?在一个模块中混合编码范式(在您的情况下是托管和非托管)通常是个坏主意。真的是关于 Person 班虽然我不会否认非托管C++有其魅力,但混合模式项目根本没有魅力。