2017-06-23 21 views
0

libcurl静的バージョンを使用してコンパイルされたDLLを取得することに固執しています。私は、未解決の外部として、以下の3つの機能を得る:ここでMSVC 2015/libcurl /未解決の外部_curl_easy_init @ 0など

1>curl.obj : error LNK2001: unresolved external symbol [email protected] 
1>curl.obj : error LNK2001: unresolved external symbol [email protected] 
1>curl.obj : error LNK2001: unresolved external symbol [email protected] 

リンカアクションからスニップです:

1>Searching libraries 
1>  Searching D:\develop\rm-asset\c-code\libs\libcurl.lib: 
1>  Found _curl_easy_setopt 
1>   Referenced in curl.obj 
1>   Loaded libcurl.lib(easy.obj) 
1>  Found _curl_slist_free_all 
1>   Referenced in libcurl.lib(easy.obj) 
1>   Loaded libcurl.lib(slist.obj) 

だから私のコードは問題がありませんcurl_easy_setopt(...)を使用していますそしてちょうど私が私が見るDUMPBIN.EXEとlibcurl.lib内のシンボルを見てみるとcurl_easy_init(...)

を使用するのと同じエリアにある:

SECTION HEADER #B 
.text$mn name 
     0 physical address 
     0 virtual address 
     3D size of raw data 
    5D25 file pointer to raw data (00005D25 to 00005D61) 
    5D62 file pointer to relocation table 
     0 file pointer to line numbers 
     3 number of relocations 
     0 number of line numbers 
60501020 flags 
     Code 
     COMDAT; sym= _curl_easy_init 
     16 byte align 
     Execute Read 

シンボルが含まれていることを示すIMOはどれですか。少なくともそれはcurl_easy_setoptの場合とよく似ています:

SECTION HEADER #17 
.text$mn name 
     0 physical address 
     0 virtual address 
     23 size of raw data 
    7245 file pointer to raw data (00007245 to 00007267) 
    7268 file pointer to relocation table 
     0 file pointer to line numbers 
     1 number of relocations 
     0 number of line numbers 
60501020 flags 
     Code 
     COMDAT; sym= _curl_easy_setopt 
     16 byte align 
     Execute Read 

これはlibcurlのを使用して自分のアプリケーションのためのコンパイラのコマンドラインです:

/GS /debug:expr-source-pos /analyze /W3 /Zc:wchar_t /I"d:\develop\rm- 
asset\c-code\include" /I"D:\develop\rm-asset\c-code\extensions\qq-pun-mel-l\src" 
/O3 /Fd"R_Extended_Aliased\vc140.pdb" /fp:precise /fp:extended /D 
"REAL_T_EXTENDED" /D "_HAVE_SQLITE_CONFIG_H" /D "SQLITE_ENABLE_REDEF_IO=1" /D 
"SQLITE_ENABLE_CEROD=1" /D "SQLITE_DLL=1" /D "SQLITE_HAS_CODEC=1" /D 
"BUILDING_DLL" /D "R2" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D 
"SAPHIRIONDLL_EXPORTS" /D "ZLIB_WINAPI" /D "NDEBUG" /D "CURL_STATICLIB" /D"USE_WINDOWS_SSPI" /D "USE_SCHANNEL" /D "USE_WIN32_IDN" /D "WANT_IDN_PROTOTYPES" 
/D "_WINDLL" /D "_UNICODE" /D "UNICODE" /D "SQLITE_ENABLE_SESSION" /D 
"SQLITE_ENABLE_PREUPDATE_HOOK" /Zc:forScope /Gz /MT /Fa"R_Extended_Aliased\" 
/EHsc /nologo /Fo"R_Extended_Aliased\" /Qprof-dir "R_Extended_Aliased\" /Ot 
/Fp"R_Extended_Aliased\saphirion.pch" 

そう...なぜこれらの3つの機能ができます私は本当に困惑しています解決されません。どんなアイデアをチェックするか、さらに調査する方法?

+0

curlに静的にリンクすると、curlを使用するすべてのコードに対してCURL_STATICLIBマクロを定義する必要があると思います。https://curl.haxx.se/docs/faq.html#Link_errors_when_building_libcur – nos

+0

、申し訳ありませんが誤ったコマンドラインを投稿しました。一定。 –

+0

さて、もう少しです。問題は異なる呼び出し規約です。私のDLLは__stdcallを使用し、libcurlは__cdeclを使用します。 __stdcallでlibcurlをコンパイルしようとすると、関数シグニチャを変更して__cdeclのままにしなければなりませんでした。しかし、私のテストプログラムがクラッシュする... libcurlがWindows上で__stdcallを使用していない理由は何ですか? __stdcallを使用する方法 –

答えて

0

これは呼び出し規約であることが判明しました。したがって、libcurlを使用するすべてのパーツが__cdecl呼び出し規約を使用していることを確認してください。