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++ でコンパイルされた 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++ でコンパイルされたアンマネージ ライブラリをラップするにはどうすればよいですか?

ありがとう、

4

1 に答える 1

2

不可能です。G++ と Visual C++ では、オブジェクト/ライブラリ ファイルに関する期待が大きく異なります。アンマネージ部分を Visual C++ で再コンパイルし、そこにリンクすることができます。

または、G++ で DLL をビルドし、C++/CLI から P/Invoke することもできます。

編集: (C ではなく) C++ ライブラリであるため、二重に不可能です。G++ と Visual C++ は名前マングリングに同意しません。そのため、リンク/動的ロード時に一致する C++ シンボルはありません。

とは言っても、そもそもなぜこんなことをしているのですか?1 つのモジュール内でコーディング パラダイム (この場合はマネージドとアンマネージド) を混在させることは、一般的には悪い考えです。それは本当にPersonクラスのことですか?アンマネージ C++ に魅力があることは否定しませんが、混合モード プロジェクトにはまったく魅力がありません。

于 2013-10-17T19:49:39.500 に答える