Podmíněné kopírování nativních knihoven

Visual Studio Development General

8 years ago

Při práci s nativními knihovnami závislými na architektuře projektu (jako je například SQLite) často potřebujeme zkopírovat do výstupní složky projektu korektní DLL soubory, které chceme využívat pro vybraný typ procesorové architektury. Ale jak toho dosáhnout jednoduše bez nutnosti manuálního kopírování? Odpovědí jsou "Pre-build event commands" ve Visual Studiu. Nejprve si vytvořte složku pro knihovnu kterou chcete kopírovat a do ní vytvořte podsložky odpovídající architekturám, které podporuje. Do každé z těchto podsložek vložte DLL a podpůrné soubory dané knihovny.

sqlite

Nyní klikněte pravým tlačítkem myši ve Visual Studiu na kořen projektu v Solution Exploreru a vyberte Properties. V otevřeném okně vlastností projektu vyberte v levém panelu záložku Build Events. Objeví se před vámi dvě prázdné textové oblasti. Do nich můžete zapisovat příkazy, které se provedou před, respektive po sestavení projektu.

Build

Klikněte nyní na tlačítko Edit Pre-build ... a můžete začít vkládat své příkazy. Pro naše účely bude dostačující využít jednoduchý ale mocný systémový nástroj xcopy pro zkopírování souborů ze složky s naší knihovnou do složky výstupu projektu:

xcopy $(ProjectDir)..\libs\sqlite\$(PlatformName)\* $(TargetDir) /E /Y

Vysvětleme si, co tento příkaz provádí. Xcopy má dva hlavní parametry - zdroj kopírování a cíl kopírování. Moje složka sqlite je umístěna ve složce libs, která je ve stromové struktuře o úroveň výše než hlavní složka projektu (kterou specifikujeme řetězcem "\((ProjectDir)"**) - tedy nejprve přejdu o úroveň výše sekvencí **"..\"**, pak odsud do **"libs\sqlite\"**. Zde musím vejít do podsložky odpovídající architektuře projektu. Odpovídající řetězec "x64", "x86", či jiný získáme makrem **"\)(PlatformName)". Nyní konečně vybereme pro kopírování všechny soubory v této složce pomocí hvězdičky ("*"). Cílová složka pro kopírování je výstupní složka projektu, označovaná makrem "$(TargetDir)". Nakonec ještě přidávám dvě volby: "/E" (aby se při kopírování zahrnuly mezi zdroje i podsložky) a "/Y" (abychom vždy přepsali existující soubory v cílové složce). Nyní před každým sestavením projektu bude náš příkaz proveden a soubory zkopírovány. Vše probíhá automaticky bez nutnosti další manuální práce. Na závěr ještě podotknu, že je možné samozřejmě provádět i více příkazů - každý prostě uveďte na nový řádek, a lze v pre-build a post-build akcích provádět takřka cokoliv co dovoluje příkazová řádka - není nutné se omezit na kopírování.