0

Nurbs ライブラリ ( http://www.rhino3d.com/opennurbs ) をプロジェクトに統合しているときに、ライブラリ zlib で次のリンク エラーが発生します。

1>zlib.lib(deflate.obj) : error LNK2019: unresolved external symbol _zcfree referenced in     function _z_deflateInit2_
1>zlib.lib(inflate.obj) : error LNK2001: unresolved external symbol _zcfree
1>zlib.lib(deflate.obj) : error LNK2019: unresolved external symbol _zcalloc referenced in     function _z_deflateInit2_
1>zlib.lib(inflate.obj) : error LNK2001: unresolved external symbol _zcalloc 

機能を確認しました

z_deflateInit2

ZLIB ソース コードのファイルdeflate.cで、この関数がzcfreeとzcallocの 2 つの関数の実装を見つけることができないと推測します。その理由は、 Nurbsライブラリが関数zcfreezcallocをカスタマイズするためです。これは 2 つのステップで行われます。

  1. Nurbsライブラリ コードでzcalloczcfreeをカスタマイズします。

    opennurbs_zlib.h
    extern "C" {
        voidpf zcalloc (voidpf, unsigned, unsigned);
        void  zcfree (voidpf, voidpf);
    }
    

    これら 2 つの関数は、ファイルopennurbs_zlib_memory.cppに次 のように実装されています。

    #define voidpf z_voidpf
    voidpf zcalloc (voidpf, unsigned items, unsigned size)
    {
        return oncalloc(items, size);
    }
    
    void  zcfree (voidpf, voidpf ptr)
    {
        onfree(ptr);
    }
    
  2. フラグ MY_ZCALLOC および Z_PREFIX を使用して ZLIB ライブラリをコンパイルします。

確認したところ、これら 2 つの手順は両方とも完了していますが、リンク エラーがまだ発生するのはなぜですか。

アドバイスをいただけますか?本当にありがとう!

更新: @Dale Lear: ご支援いただきありがとうございます。しかし、私の状況は異なります。代わりに、opennurbs.lib とリンクする場合は、opennurbs のソース コードを自分のプロジェクトに統合しようとしました (点群ライブラリのサーフェス モジュールのように: http://www.pointclouds.org/blog/trcs/moerwald/ )。opennurbs ソリューションのプロジェクト zlib から zlib をビルドします。この zLib は、変更された zconfig.h (Z_PREFIX と Z_MYCALL が定義されていると思います) を使用してビルドされています。これは、関数 zfree と zalloc がまだ実装を待っていることを意味します。しかし、ZLib が opennurbs_zlib_memory.cpp から zcfree() と zcalloc を取得しないのはなぜですか。なぜかかるのかわかりません。

4

1 に答える 1

1

あなたの説明とあなたが提供したエラーログから、私は状況が次のようになっていると推測しています:

1) Microsoft の C++ コンパイラのいくつかのバージョンを使用して Windows プログラムを構築しています。

2) zlib.lib と静的にリンクしたい

3) opennnurbs_staticlib.lib と静的にリンクしたい

使用している Microsoft の C++ コンパイラまたは opennurbs のバージョンを特定できません。

opennurbs の最新の公開リリース (バージョン 2013-07-11) を使用している場合、zcfree() および zcalloc() 関数はファイル opennurbs_zlib_memory.cpp で定義されています。

ソース コードに含まれている opennurbs_staticlib.vcxproj プロジェクト ファイルを使用して opennurbs_staticlib.lib をビルドすると、opennurbs_zlib_memory.cpp がコンパイルされ、zcfree() および zcalloc() 関数が opennurbs_staticlib.lib に含まれます。zlib コードと、opennurbs 2013-07-11 に含まれている zlib/zlib.vcxproj ファイルを使用して zlib をビルドすると、必要な定義がすべて含まれてビルドされ、zlib.lib と opennurbs_staticlib の 2 つの静的ライブラリが作成されます。 lib、すべての依存関係が解決されたリンク。

カスタマイズされたプロジェクト ファイルを使用している場合、最初に確認することは、何らかの方法で opennurbs_zlib_memory.cpp をコンパイルした結果を静的にリンクしていることです。

opennurbs を DLL として使用する場合は、ソース コードに付属する opennurbs.vcxproj プロジェクト ファイルを使用して opennurbs.dll をビルドすることをお勧めします。この opennurbs.dll は、リンク時に zlib.lib を静的にインクルードします。DLL バージョンを使用するために、結果の opennurbs.lib 以外とリンクする必要はありません。

これは役に立ちますか?

-- デイル・リア

于 2014-07-23T16:37:06.653 に答える