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

时间:2013-10-17 19:40:01

标签: visual-studio-2010 g++ c++-cli

是否可以包装在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解决方案(VS-Person.lib)中编译的lib时,它运行得很好但是当使用用g ++编译的lib(GPPPerson.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 个答案:

答案 0 :(得分:2)

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

或者,您可以使用C ++ / CLI在G ++和P / Invoke中构建DLL。

编辑:因为它是一个C ++库(而不是C语言),所以是不可能的。 G ++和Visual C ++不同意名称修改;因此,在链接/动态加载时,没有任何C ++符号匹配。

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