У меня есть решение Windows Driver Kit, которое создает DLL для драйвера принтера. Затем я преобразовываю двоичный код в C-код и включаю его в исходный код, чтобы можно было извлечь dll во время выполнения, и мне не нужно распространять два файла, только .exe.
Однако мне нужно собрать dll для i386 и amd64, в результате чего появятся два dll и, следовательно, два c-файла для включения. Я могу проверить во время компиляции, какой файл включить, но мы генерируем наши проекты Visual Studio с помощью cmake, и я хотел бы включить в проект правильный файл c и исключить другой. Это позволит перестроить на работу, предотвратит дублирование символов и т. Д.
Мы создаем проект Visual Studio, запустив cmake для «Visual Studio 9 2008» или «Visual Studio 9 2008 Win64». Не представляется возможным создать проект Visual Studio для обеих архитектур, поэтому я мог бы просто проанализировать "CMAKE_GENERATOR: INTERNAL = Visual Studio 9 2008" и добавить в мой файл cmakelists.txt соответствующую проверку.
Вот файл cmakelists.txt для рассматриваемого подпроекта
if(WIN32)
project (StaticDriverLib)
file(GLOB DriverLib_CPP *.cpp ../MasterInstallDir/*.cpp ../MasterInstallDir/amd64/*.cpp ../MasterInstallDir/i386/*.cpp)
file(GLOB DriverLibLib_H *.hpp *.h ../MasterInstallDir/*.hpp)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../ ${CMAKE_CURRENT_SOURCE_DIR}/../MasterInstallDir)
# static DriverLibLib library
add_library(StaticDriverLibLib ${DriverLib_CPP} ${DriverLib_H})
add_dependencies(StaticDriverLib StaticLibCore)
target_link_libraries(StaticDriverLib StaticCore Version.lib Setupapi.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib odbc32.lib odbccp32.lib)
endif(WIN32)
Как видите, есть каталог i386 и каталог amd64, содержащий кодированные двоичные файлы для конкретной архитектуры. Как настроить файл cmakelists.txt, чтобы исключить одно или другое в зависимости от целевого генератора? Для 64 бит мы поддерживаем VS2008 и скоро VS2010.