1

tcl/tk (8.5)を外部の c ライブラリで実行して、d2xx USB ライブラリに接続していますVS 2012 Native ToolsWindows 8 を実行していて、コマンド プロンプトを使用してライブラリをコンパイルしようとしています。コマンドプロンプトを起動すると、私の PWD は次のようになります。

\Program Files (x86)\Microsoft Visual Studio 11.0\VC

c ライブラリ (tclftd2xx.c) には、必要な tcl ライブラリと d2xx ヘッダーにリンクするための環境を適切にセットアップする仮想スタジオ用の nmake ファイルが付属しています。

VS コマンド ウィンドウで、makefile.vc を含むディレクトリに移動し、次のように入力します。

nmake .....

そして、tclftd2xx.dll を取得します。

tclftd2xx.dll calls msvcr110.dll. これらの両方が /Tcl/lib に適切に配置されている場合、Windows 8 システム、Vista、および Windows 7 でうまく機能します。

ただし、Windows XP にインストールすると、Windows は tclftd2xx.dll をロードできません。

いくつかの検索を行ったところ、v110_xp ツールセット用に VS2012 を構成する必要があることがわかりました。リンク ( http://blogs.msdn.com/b/vcblog/archive/2012/10/08/10357555.aspx ) には次のメモがあります。

v110_xp ツールセットに切り替えられた Visual Studio 2012 ソリューションおよびプロジェクトは、追加の手順なしで、MSBuild または DEVENV を使用してコマンド ラインからビルドできます。

ただし、CL と Link を直接使用する場合は、追加の手順が必要です。以下の手順は、バッチ スクリプトを作成することで自動化できることに注意してください。

私がここでやったこと:

REM set include and path variables
set INCLUDE=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Include;%INCLUDE%
set PATH=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Bin;%PATH%

REM When targeting X86, set the lib path as follows:
set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib;%LIB%

REM set the compiler options
set CL=/D_USING_V110_SDK71_;%CL%

REM  When targeting x64, set the lib path as follows:
REM  set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\7.1A\Lib\x64;%LIB%

REM  Specify the correct subsystem and subsystem version for the linker based on the type of
REM  application you are building. Applications targeting the x86 version of Windows XP must specify
REM  subsystem version 5.01, and applications targeting x64 must specify version 5.02.

REM  For x86 console applications:
set LINK=/SUBSYSTEM:CONSOLE,5.01 %LINK%

REM  For x64 console applications:
REM  set LINK=/SUBSYSTEM:CONSOLE,5.02 %LINK%

XP バージョンをビルドするには、VS コマンド ラインから 1) .bat ファイルを実行しました 2) nmake .....

Windows 8 のターゲット dll とまったく同じサイズの .dll を取得します。

だから私は2つの質問があります:

  1. の実行に加えて、v110_xp ツールセットを有効にするために実行する必要がある他の魔法の構成スクリプトまたは環境変数はありますか.bat file、または .bat ファイルを実行すると完全な構成が行われますか?
  2. XP システムにロードする以外に、.dll が実際に XP システムをターゲットにしていることを確認する方法はありますか?
4

2 に答える 2

2

変数を設定するために、次のバッチ スクリプトを思いつきました。Visual Studio 2012 でコードをビルドできるようにするには、プロジェクトにこれを含める必要があるようです。

@echo off
goto :start

:check_dir
    if not exist "%~1" (
        echo Directory "%~1" does not exist.
        echo Things may not work as expected.
    )
    goto :eof

:start
    setlocal
    if "%PROCESSOR_ARCHITECTURE%" == "x86" (
        set "ProgramFiles(x86)=%ProgramFiles%"
    )

    set "BINDIR=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Bin"
    set "INCDIR=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Include"
    set "LIBDIR=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Lib"
    set "SUBSYS=CONSOLE,5.01"

    REM for x64 instead of x86:
    REM set "LIBDIR=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Lib\x64"
    REM set "SUBSYS=CONSOLE,5.02"

    call :check_dir "%%BINDIR%%"
    call :check_dir "%%INCDIR%%"
    call :check_dir "%%LIBDIR%%"

    endlocal & (
        set "CL=/D_USING_V110_SDK71_;%CL%"
        set "LINK=/SUBSYSTEM:%SUBSYS% %LINK%"
        set "LIB=%LIBDIR%;%LIB%"
        set "PATH=%BINDIR%;%PATH%"
        set "INCLUDE=%INCDIR%;%INCLUDE%"
    )
于 2013-08-17T17:20:49.097 に答える
0

msvcrt と tclftd2xx dll の両方を含める必要はありません。コンパイラは、どの C++ ランタイムをロードする必要があるかを示すために必要な情報をランタイム ローダーに提供するマニフェストを生成します。表示されているエラーは、新しいコンパイラをサポートするために rules.vc ファイルを更新する必要があるということです。これが完了すると、makefile 変数 _VC_MANIFEST_EMBED_DLL が、コンパイラ マニフェスト ファイルを結果の DLL にマージするために必要なコマンドに設定されます。

github でプロジェクトを更新したので、これはもはや問題ではありません。

于 2013-07-02T13:50:59.320 に答える