27

g++用に作成したプロジェクトのMSVCでリンクの問題が発生しています。ここに問題があります:

アプリケーションの一部として静的ライブラリとしてlibsshをビルドし、cmakeにターゲットを追加します。

add_library(ssh_static STATIC $ libssh_SRCS)

LibsshはCであるため、c++ソースのインクルードを'extern"C"{...}'でラップしています。次に、ssh_staticターゲットを実行可能ファイルsshconnectiontestにリンクします。

target_link_libraries(sshconnectiontest ... ssh_static ...)

これはすべて、gccを使用するLinuxで正常に機能しますが、MSVCでは次のようになります。

error LNK2019: unresolved external symbol __imp__[function names here] referenced in [filename]

私が使用するすべてのlibssh関数に対して。

何がうまくいかないのですか?impプレフィックスは、リンカーが.dllのリンクを期待していることを意味することをどこかで読みましたが、ssh_staticはadd_library呼び出しで静的ライブラリとして宣言されているため、そうではないはずです...

4

4 に答える 4

32

私がWindowsの時代を思い出したところ、MinGWで構築されたDLLでは、__imp__DLLを適切に呼び出すトランポリン関数にシンボルプレフィックスが使用されています。このシンボルは、拡張子が。の小さな静的ライブラリによって提供され.dll.aます。

libsshヘッダーを含める場合は、#define静的にリンクすることを期待していることを示すためにを設定する必要があります。そうしないと、ヘッダーのlibssh関数が宣言される__declspec(dllimport)ため、__imp__リンク時にシンボルが期待されます。

私はlibsshソースを見て、これを上部に見つけましたlibssh.h

#ifdef LIBSSH_STATIC
  #define LIBSSH_API
#else
  #if defined _WIN32 || defined __CYGWIN__
    #ifdef LIBSSH_EXPORTS
      #ifdef __GNUC__
        #define LIBSSH_API __attribute__((dllexport))
      #else
        #define LIBSSH_API __declspec(dllexport)
      #endif
    #else
      #ifdef __GNUC__
        #define LIBSSH_API __attribute__((dllimport))
      #else
        #define LIBSSH_API __declspec(dllimport)
      #endif
    #endif
  #else
    #if __GNUC__ >= 4
      #define LIBSSH_API __attribute__((visibility("default")))
    #else
      #define LIBSSH_API
    #endif
  #endif
#endif

行の前から、LIBSSH_STATICまたはオプションとして、を定義する必要があります。CMakeを使用しているので、おそらくでこれを実行します。#define#include <libssh.h>/Dadd_definitionsCMakeLists.txt

于 2010-09-15T01:43:30.190 に答える
12

それがあなたの場合かどうかはわかりませんが、impプレフィックスは、Win32プロジェクトでx64ライブラリをコンパイルしていることを意味している可能性があります。

于 2011-05-05T08:35:34.210 に答える
1

パーティーに少し遅れましたが、ライブラリをCRTへの静的および動的リンクと混合したときに同じエラーが発生しました

于 2017-05-10T05:48:35.097 に答える
0

.DEFファイルの使用

__declspec(dllimport)を.DEFファイルと一緒に使用することを選択した場合は、.DEFファイルを変更してDATAまたはCONSTANTを使用し、誤ったコーディングによって問題が発生する可能性を減らす必要があります。

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   CONSTANT

次の表にその理由を示します。

Keyword      Emits in the import library   Exports
CONSTANT     _imp_ulDataInDll              _ulDataInDll
             _ulDataInDll                  

DATA         _imp_ulDataInDll              _ulDataInDll

http://msdn.microsoft.com/en-us/library/aa271769(v=vs.60).aspx

しかし、 CONSTANTは非推奨になりました

エクスポートされた.libの.DEFファイルで別の方法を見つけました。

 mainthreadid=_mainthreadid

LIB.exeを使用してlibを再生成します

dllコードのインポートヘッダーファイルで...

extern "C" {
  extern const __declspec(dllexport) ulong mainthreadid;
}
于 2011-08-05T21:31:25.970 に答える