7

ヘルパー関数を使用して共有ライブラリ/DLL を作成しています。そのため、今後名前が衝突しないように名前空間を宣言します。クラスの場合、これは正常に機能しますが、名前空間にも入れたいグローバル関数がいくつかあり、これは機能しません。名前空間を指定しようとすると、リンカー エラーが発生します。名前空間を DLL 内からエクスポートできないようです。

私はグーグルで検索して、このスレッドを見つけましたここで名前空間のDECLSPECをどこに置くべきですか? そして、私は答えをよく理解していません。名前空間のポイントは、名前を分離して一意に識別できるようにすることです。そのため、名前空間をエクスポートする必要がないという答えが受け入れられているのはなぜだろうか。ただし、ここで何かが足りないかもしれません。名前空間自体はエクスポートできないことがわかりますが、内部の関数は名前空間に属している必要があり、これは不可能のようです。ただし、名前空間内にあるクラスは期待どおりに機能するため、これが他のシンボルにも適用されない理由が少しわかりません。

ダミーのクラス ラッパーを作成し、関数を static として宣言することで終了しました。名前空間と 100% 似ているわけではありませんが、私の目的には十分似ています。

DLL 内:

class EXPORT_DECL Base64
{
   public:
       static std::string encode(unsigned char const *bytes_to_encode, unsigned int in_len);
       static std::string decode(std::string const &oBase64Encoded);
};

そして主に、名前空間にあったかのようにそれらに対処できます。

Base64::encode(...);

ただし、ここで何か不足していて、この回避策を使用する代わりに名前空間を使用できるかどうかを知りたいと思っていました。また、共有ライブラリにもこの制限がありますか、それとも DLL だけのものですか?

アップデート

共有ライブラリ foo.h:

namespace mytest
{
     int mytestfkt(int a);
     EXPORT_DECL int decltest(int a);
}

共有ライブラリ foo.cpp。

 int mytestfkt(int a)
 {
     return 0;
 }

int decltest(int a)
{
    return 0;
}

またはこれ:

namespace mytest
{
 int mytestfkt(int a)
 {
     return 0;
 }

 EXPORT_DECL int decltest(int a)
{
    return 0;
}
}

またはこれ:

int mytest::mytestfkt(int a)
{
 return 0;
}

EXPORT_DECL int mytest::decltest(int a)
{
return 0;
}

main.cpp:

int x = mytest::mytestfkt(1);
x = mytest::decltest(1);

結果:

undefined reference to `mytest::mytestfkt(int)'
undefined reference to `mytest::decltest(int)'
4

1 に答える 1