C++ 使用PCRE库添加的Cmake ExternalProject_无法与NMake生成器一起使用

C++ 使用PCRE库添加的Cmake ExternalProject_无法与NMake生成器一起使用,c++,build,cmake,makefile,nmake,C++,Build,Cmake,Makefile,Nmake,我正在尝试将该库作为更大构建的一部分进行构建。我的设置可以在Ubuntu上找到,使用CMake 3.2.2和ninja或make,在windows上找到CMake 3.3.2和TDM-GCC,使用Mingw32 make或ninja,但在使用NMake和visual studio 2015编译器时失败。在添加下面描述的代码之前,构建工作将在所有这些平台上进行 我使用“ExternalProject\u Add”为这个构建创建了一个目标。下面是我设置一些变量并设置外部项目的部分。为了简洁起见,我删

我正在尝试将该库作为更大构建的一部分进行构建。我的设置可以在Ubuntu上找到,使用CMake 3.2.2和ninja或make,在windows上找到CMake 3.3.2和TDM-GCC,使用Mingw32 make或ninja,但在使用NMake和visual studio 2015编译器时失败。在添加下面描述的代码之前,构建工作将在所有这些平台上进行

我使用“ExternalProject\u 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和忍者同样有效,但对NMake无效。编译编译PCRE和我的大多数C++代码,然后当链接到IT代码时,出现以下错误:

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.
起初,我担心库名会将绝对路径指定给构建目录。因此,我尝试了几种方法来调整名称,包括反转所有斜杠以使其更适合windows,以及将库名称作为相对路径传递给目标链接库。我输出每个相关变量,以便手动检查它们,检查库是否已生成,并在它们属于windows资源管理器的文件夹中找到它们。我尝试了其他一些没用的愚蠢的事情


为什么在使用NMake和msvc时会中断,而在使用Mingw和GCC时会使用Make、Ninja、Mingw32 Make?

我手动修补了PCRE版本,发现它在不同的版本中会发出名称略有不同的二进制文件。我再次查看了我的输出目录,在我的msvc构建中,我注意到PCRE静态库的名称中有一个额外的“d”。所以它们是“pcrecppd.lib”、“pcred.lib”和“pcrepoixd.lib”

我知道有些构建过程这样做是为了允许调试和发布构建共存于同一个构建目录中。因此,我通过查看cmakcache.txt来检查这是否是一个调试构建

工作构建-CMakeCache的第17至20行:

//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or
// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.
CMAKE_BUILD_TYPE:STRING=RELEASE
//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or
// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.
CMAKE_BUILD_TYPE:STRING=DEBUG
构建失败-CMakeCache的第17行到第20行:

//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or
// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.
CMAKE_BUILD_TYPE:STRING=RELEASE
//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or
// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.
CMAKE_BUILD_TYPE:STRING=DEBUG
假设这是我的问题,我决定只将外部项目设置为在发布模式下构建。我们可以将其设置为在需要调试正则表达式库的不太可能的情况下手动调试。我使用了页面上描述的CMAKE_参数

我删除了我的整个构建文件夹(以确保一个干净的状态,并避免我的手动修补造成污染),然后用cmake重新配置并重建了软件。这一次,它构建和链接没有错误


我仍然不知道为什么vs和nmake选择构建调试,而其他工具链默认发布,我也不知道有多少“D”是PCRE的错误,vs或nmake或CMake。

我至少24小时内不会将自己的答案标记为答案,因为社区通常会想出比我更好的答案,我宁愿选择一个解释原因而不仅仅是发生了什么的答案。