Я пытаюсь построить библиотеку PCRE как часть более крупной сборки. Установки, которые у меня есть, находят на Ubuntu с CMake 3.2.2 с ninja или make, CMake 3.3.2 на окнах с TDM-GCC с использованием Mingw32-make или ниндзя, но не удается при использовании NMake с компилятором visual studio 2015. Сборка выполняется на всех этих платформах, прежде чем добавлять код, описанный ниже.Cmake ExternalProject_Add с библиотекой PCRE не работает с NMake Generator
Я использовал «ExternalProject_Add», чтобы создать цель для этой сборки. Ниже приводится раздел: я установил некоторые переменные и установил внешний проект. Я сократил несколько сообщений для краткости. LibFolder - это папка в исходном дереве с и ProjectBinaryDir вне моей выходной папки.
set(PcreSrcDir "${LibFolder}pcre-8.38/")
set(PcreLibDir "${ProjectBinaryDir}PCRE-prefix/src/PCRE-build/")
set(PcreCppLib "${CMAKE_STATIC_LIBRARY_PREFIX}pcrecpp${CMAKE_STATIC_LIBRARY_SUFFIX}")
#set(PcreLib "${CMAKE_STATIC_LIBRARY_PREFIX}pcre${CMAKE_STATIC_LIBRARY_SUFFIX}")
#set(PcrePosixLib "${CMAKE_STATIC_LIBRARY_PREFIX}pcre${CMAKE_STATIC_LIBRARY_SUFFIX}")
set(PcreLibs "${PcreLibDir}${PcreCppLib}")
set(PcreIncludeDirs "${PcreSrcDir}" "${PcreLibDir}")
include(ExternalProject)
ExternalProject_Add(
PCRE
SOURCE_DIR "${PcreSrcDir}"
INSTALL_COMMAND ""
BUILD_BYPRODUCTS "${PcreLibs}"
)
Я использую PcreIncludeDirs позже с include_directories команды, и это, кажется, работает, я не получаю никаких предупреждений или ошибок, связанные с обнаружением заголовков во время любого из сборок.
Я использую PcreLibs и целевое имя PCRE настроить зависимость между библиотекой PCRE и другими библиотеками и исполняемыми файлами в моем встроенных. Вот пример, LibrarySource это и массив исходных файлов для библиотеки в этом примере и ProjectDynamicLib это название So/Dll строится:
add_library(${ProjectDynamicLib} SHARED "${LibrarySource}")
target_link_libraries(${ProjectDynamicLib} "${PcreLibs}")
add_dependencies(${ProjectDynamicLib} PCRE)
Это прекрасно работает с Make и Ninja снова, но терпит неудачу с NMake. Сборки составляют PCRE и большинства моих C++ кода, а затем, когда приходит время, чтобы ссылка на него не может со следующей ошибкой:
NMAKE : fatal error U1073: don't know how to make 'PCRE-prefix\src\PCRE-build\pcrecpp.lib'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.
Сначала я был обеспокоен тем, что имя библиотеки опущен абсолютный путь к моим сборкам каталог. Поэтому я попытался настроить имя несколькими способами, включая реверсирование всех косых черт, чтобы сделать их более дружественными к окну и передать имя библиотеки как относительный путь к target_link_libraries. Я выводю каждую связанную переменную, чтобы я мог вручную проверить их, и я проверил, что библиотеки были созданы, и я нашел их в папке, принадлежащей обозревателю Windows. Я попробовал несколько других глупых вещей, которые не сработали.
Почему это прерывается с использованием NMake и msvc, но работает с использованием Make, Ninja, Mingw32-make при использовании Mingw и GCC?
Я не буду отмечать свой ответ в качестве ответа в течение как минимум 24 часов, потому что сообщество часто придумывает что-то лучшее, чем я, и я предпочел бы выбрать ответ, который объясняет, почему, а не только то, что произошло. – Sqeaky