2012-03-19 11 views
0

CreateProcessを使用して、cllinkを呼び出して、別のC++プログラム(TestProg.cxx)をコンパイルしてDLLにリンクします。実行時にC++プログラムをDLLにコンパイルする方法

TestProg.cxxは、以下のDllMain機能が含まれます。

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 
{ 
    return TRUE; 
} 

を、私は、リンクオプションに/Entry:DllMainを追加しました。

私は、次のリンクエラーを取得:

LINK : error LNK2001: unresolved external symbol _DllMain 

main.obj : error LNK2001: unresolved external symbol __RTC_Shutdown 

main.obj : error LNK2001: unresolved external symbol __RTC_InitBase 

main.dll : fatal error LNK1120: 3 unresolved externals 

あなたは私がそれを修正する方法を教えてくださいもらえますか?ありがとう

+0

私の推測では、C++のネームマングリングに問題があることがわかります。 –

+2

ありそうもない。 'extern" C "'は、C++の名前のマングリングではなく、Cが必要であることを示す正しい方法です。しかし、Cでも名前のマングリングがあります。あなたが先頭の '_' – MSalters

+0

から感謝しています。 –

答えて

1

CRT(Cランタイムライブラリ)がありません。たとえば、__RTC_Shutdown関数を提供します。それをリンクすると、DllMainの前にラップされて開始されます。これにより、最初のリンクエラーも解消されます。

+0

ご意見ありがとうございます。リンケージオプションに '/ DLL'オプションを指定してもしなくても、コピュレーションオプションに'/LD'を使って自分のコードをテストしましたが、私は同じリンケージエラーがあります。どちらもなければ 'LINK:致命的なエラーLNK1221:サブシステムを推定できず、定義する必要があります。 'というエラーが表示されます。 '/ SUBSYSTEM'リンクオプションを使用すると、' .exeファイルの実行方法をオペレーティングシステムに知らせます。 'というエラーが表示されますが、追加したときに同じリンクエラーが再び表示されます。 CRTを追加する方法を教えてください(私は/ CRTオプションが見つかりませんでした)。ありがとう! – ZOK

+0

@ZOK:通常の解決方法は、 '/ MT'を_compiler_に渡すことです。 CRTのバージョンは複数あり、リンカの選択肢はコンパイラと一致する必要があります。したがって、リンカは.objファイルからコンパイラの内容を読み取ります。しかし、私がすでにあなたに言ったように、とにかくライナーを起動してCL.exeに残すべきではないでしょう。 – MSalters

+0

あなたのコメントをありがとう。私はリンカーを起動しません、私はそれを 'cl'に任せます。コンパイラに '/ MT'を渡すと、' LINK:致命的なエラーLNK1221:サブシステムを推論することができず、定義する必要があります。 'というエラーが出ました。リンカーに '/ SUBSYSTEM:WINDOWS'を渡すと、3つのリンケージエラーが再び発生します。これを修正する方法を教えてください。ありがとう! – ZOK

関連する問題