2017-08-31 54 views
1

的Visual Studio提供目標平臺版本設置爲çC++項目。我正在用目標平臺版本8.1構建我的代碼。但是,當我與產生MSVC解決方案CMake的一些第三方庫的默認設置是目標平臺10.x版。當應用程序使用編譯爲的庫時,仍然可以在舊版本上運行我的應用程序Windows版本如Vista/7/8目標平臺版本10.x將某個庫的MSVC中的目標平臺版本設置爲10.x使得程序與Windows Vista/7/8上的程序不兼容?

+1

如果您將目標設置爲Windows 10,使您可以使用早期版本中不存在的功能。如果你這樣做,那當然會成爲一個問題。 –

回答

0

我使用的的WindowsSDK的Windows 10開始提供GetIntegratedDisplaySize功能測試場景中的問題。我測試的情況下使用目標平臺10.x版和使用目標平臺8.1版的靜態和共享庫的可執行文件。結果如下:

  1. 在靜態庫的情況下:

    嘗試使用功能GetIntegratedDispaySize還需要連接的OneCoreUAP.lib其中函數的實現是靜態鏈接庫。由於OneCoreUAP.libWindows 10功能當目標平臺版本的可執行文件設置爲8.1該庫不能鏈接在其中,編譯器會產生鏈接時間錯誤。由於可執行文件無法創建,因此無法在任何版本的Windows版本上運行。

  2. 在共享庫的情況下。

    由於共享庫使用目標平臺版本10.x它成功鏈接到OneCoreUAP.lib所需的GetIntegratedDispaySize函數。共享庫dll文件和導入lib文件被創建。試圖將可執行文件與進口lib工作和對運行正常的Windows 10創建可執行鏈接。試圖啓動可執行文件,並在共享庫dll上使用老版本Windows版本(Windows 7用於實驗)會產生錯誤api-ms-win-core-sysingo-l1-2-3.dll。因此,可執行文件不能在較早的版本上運行Windows版本可能除非全部需要dll文件將隨之重新分發。

1

如果庫是可選的DLL的(即你可以沒有他們跑,只是退化的功能),然後有一個解決方案:使用延遲加載。延遲加載的DLL只在您調用該DLL中的第一個函數時加載。現在,當您使用Windows 7/8時,請避免調用任何此類函數,並且不會出現加載失敗。

靜態庫可能會導致問題,因爲它們鏈接到你的可執行文件。這意味着Windows 7將不會發現到底發生了什麼錯,但你仍然得到問題,當您嘗試調用這是僅在Windows 10推出。然而,如果靜態庫只使用Windows 7功能的函數,它會工作。

+0

如果我的可執行文件是使用** Target Platform Version 8.1 **編譯的,但是靜態庫使用** 10.x **並使用** Windows 10 **函數,那麼即使在編譯時也會顯示此問題? – bobeff

+1

@bobeff:不確定。你爲什麼不嘗試回報? – MSalters

+0

僅在Windows 10上有一些簡單的Windows API函數可供您嘗試使用嗎? – bobeff

相關問題