fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

 

MFCをスタティックリンクしたときに出るエラー

 MFCを使う場合、MFCをDLLとして使う方法と、MFCをスタティックリンクさせて1つの実行ファイルにする方法があります。これはプロジェクト設定の「全般」の設定で設定できます。

 ところが最初にDLLを使うようにプロジェクトを作成して、後からスタティックリンクするように変更すると、ビルドエラーが出るときがあります。エラーメッセージは次のようなものです。

fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

 これはafxver_.h内のプリプロセッサで出ているものですが、_AFXDLLという定義は、本来MFCをDLLで使うときにしか定義されないものです。これが何かしらの原因で定義されてしまっているため、ビルドエラーが出ているのです。

 ビルドが実行された時に、どんなオプションが実際に使われたかというのは、出力フォルダにできるBuildLog.htmを見るとわかります。たとえば次のように出力されています。

コマンド ライン      
一時ファイル "g:/projects/TimerTool/Debug/RSP00000D.rsp" を作成しています。内容 :
[
/Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FD /EHsc /RTC1 /MTd /Yc"stdafx.h" 
/Fp"./Debug/TimerTool.pch" /Fo"./Debug/" /Fd"./Debug/" /FR"./Debug/" /W3 /c /ZI /TP
./StdAfx.cpp
]

 これを見ると、確かにビルド時に_AFXDLLが定義されているのがわかります。(/Dオプションはビルド時に定義を追加します。#defineでソースコードに書くのと同じ効果があります。ただし/Dで定義した場合は全ソースに影響します。)

 これを直すには、プロジェクト設定の「C/C++」「リンカ」「リソース」タブの「コマンドライン」を順に見ていって、"_AFXDLL"が追加されていないか確認します。追加されていたら、"プリプロセッサの定義"から"_AFXDLL"を削除します。

 これでビルドしてもまだBuildLog.htmに"_AFXDLL"が出てくるときは、ソースファイル単位の定義追加がされている可能性があります。これはプロジェクトファイルを直接テキストエディタで開いて調べてみます。拡張子".vcproj"のファイルをテキストエディタで開くと、ソースファイルごとのオプション設定が記述してあるのがわかります。

 ここで、<Files>セクションの中で<Tool>の中にある、"PreprocessorDefinitions"というのが、ソースファイルごとの定義追加になります。ここに"_AFXDLL"が記述してあるときは、これをすべて削除します。これでビルド時に"_AFXDLL"が定義されなくなるはずです。

...
    <Files>
        <Filter
            Name="Source Files"
            Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
            <File
                RelativePath="Importer.cpp">
                <FileConfiguration
                    Name="Debug|Win32">
                    <Tool
                        Name="VCCLCompilerTool"
                        PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_AFXDLL;_MBCS;$(NoInherit)"
                        BasicRuntimeChecks="3"
                        BrowseInformation="1"/>
                </FileConfiguration>

...

 この問題は、VC6.0などの古いバージョンで作ったプロジェクトを.net環境に移行した場合などに起こるようです。同じパージョンで作ったプロジェクトの場合は、プロジェクトの設定だけでMFCのリンク方法が切り替えられます。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值