是否可以包装在C ++ / CLI中使用g ++编译的静态库?
这是我的尝试:
#include <string>
class Person
{
public:
Person(void);
~Person(void);
void Print(std::string, std::string);
};
#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 ++编译的非托管库?
谢谢,
答案 0 :(得分:2)
这是不可能的。 G ++和Visual C ++对对象/库文件有着截然不同的期望。可以在Visual C ++中重新编译非托管部分并链接到该部分。
或者,您可以使用C ++ / CLI在G ++和P / Invoke中构建DLL。
编辑:因为它是一个C ++库(而不是C语言),所以是不可能的。 G ++和Visual C ++不同意名称修改;因此,在链接/动态加载时,没有任何C ++符号匹配。那就是说,你为什么要这样做呢?在一个模块中混合编码范例(在您的情况下是托管的和非托管的)通常是一个坏主意。是真的关于Person
班吗?虽然我不会否认非托管C ++有其魅力,但混合模式项目根本没有魅力。