2013-04-18 56 views
1

我正在運行tcl/tk(8.5)與外部c庫連接到一個d2xx USB庫。我正在運行Windows 8並嘗試使用VS 2012 Native Tools命令提示編譯庫。當我啓動命令提示符我PWD是:我該如何編譯Windows XP與Visual Studio 2012從命令提示符

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

C庫(tclftd2xx.c)附帶爲正確設置環境鏈接到所需要的TCL庫,並與D2XX頭虛擬演播室NMAKE文件。

在VS命令窗口,我的CD含有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)有這樣一個字條:

的Visual Studio 2012級的解決方案,並已切換到 的v110_xp工具集可以使用的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文件。

所以我有兩個問題:

  1. 有一些其他神奇的配置腳本或環境變量我要運行,以使另外的v110_xp工具集來執行.bat file,或不執行.bat文件做完整的配置?
  2. 是否有某種方法可以確認.dll確實是針對XP系統的目標,而不是嘗試將其加載到XP系統上?
+0

爲什麼不使用VS構建系統而不是使用古老的nmake? – 2013-04-18 06:31:49

+0

makefile.vc並不那麼簡單。例如,它與TCL安裝密切相關(它表示它實際上源於此)。我不知道如何將所有這些東西導入到VS構建中。 – user1967890 2013-04-18 06:43:40

+0

我還在尋找一種使用VS2012的nmake編譯WinXP的優雅方法。我非常生氣,因爲這讓MS變得如此複雜。如果vcvarsall.bat允許一個參數指定目標,那本來就很容易。而且,他們提供的步驟甚至不能可靠地工作。我必須自己解決%ProgramFiles%與%ProgramFiles(x86)%問題。 – Sven 2013-08-17 16:27:27

回答

0

您不應該同時包含msvcrt和tclftd2xx dll。編譯器生成一個清單,它向運行時加載程序提供必要的信息,以指明應該加載哪個C++運行時。你看到的錯誤是規則。vc文件需要更新才能支持較新的編譯器。完成此操作後,makefile變量_VC_MANIFEST_EMBED_DLL將被設置爲將編譯器清單文件合併到生成的DLL中所需的命令。

我已經更新了github上的項目,所以這應該不再是一個問題。

+0

這甚至不是問題的答案,是嗎? – Sven 2013-08-17 16:27:59

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%" 
    ) 
+2

我試過這種方法/批處理腳本與VS 2013和內置的應用程序在Windows XP上運行良好,但有一些警告,如:1。 windows \ v7.1a \ include \ sal_supp.h(57):warning C4005:'__useHeader':宏重新定義; C:\ Program Files文件(x86)\ Microsoft Visual Studio 12.0 \ VC \ INCLUDE \ sal.h(2886):參見'__useHeader'的先前定義2. windows \ v7.1a \ include \ specstrings_supp.h(77):warning C4005:'__on_failure':宏重定義; C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ INCLUDE \ sal.h(2896):請參閱以前的'__on_failure' – 2014-12-07 12:15:59

相關問題