0

是否可以在 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++(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++ 编译的非托管库?

谢谢,

4

1 回答 1

2

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

或者,您可以在 G++ 中构建一个 DLL,然后从 C++/CLI 中 P/Invoke。

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

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

于 2013-10-17T19:49:39.500 回答