“CMake”这个名字是“cross platform make”

实践:

严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息
错误 CMake Error at C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.27/Modules/CMakeTestCCompiler.cmake:67 (message):
The C compiler

"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe"

is not able to compile a simple test program.

It fails with the following output:

Change Dir: 'D:/coding/myc/CMakeProject1/out/build/x64-debug/CMakeFiles/CMakeScratch/TryCompile-qi4abu'

Run Build Command(s): "C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe" -v cmTC_8e63c
[1/2] C:\PROGRA~1\MICROS~2\2022\COMMUN~1\VC\Tools\MSVC\1438~1.331\bin\Hostx64\x64\cl.exe /nologo /DWIN32 /D_WINDOWS /W3 /MDd /Ob0 /Od /RTC1 -Zi /showIncludes /FoCMakeFiles\cmTC_8e63c.dir\testCCompiler.c.obj /FdCMakeFiles\cmTC_8e63c.dir\ /FS -c D:\coding\myc\CMakeProject1\out\build\x64-debug\CMakeFiles\CMakeScratch\TryCompile-qi4abu\testCCompiler.c
[2/2] cmd.exe /C "cd . && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\cmTC_8e63c.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests -- C:\PROGRA~1\MICROS~2\2022\COMMUN~1\VC\Tools\MSVC\1438~1.331\bin\Hostx64\x64\link.exe /nologo CMakeFiles\cmTC_8e63c.dir\testCCompiler.c.obj /out:cmTC_8e63c.exe /implib:cmTC_8e63c.lib /pdb:cmTC_8e63c.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
FAILED: cmTC_8e63c.exe
cmd.exe /C "cd . && "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\cmTC_8e63c.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests -- C:\PROGRA~1\MICROS~2\2022\COMMUN~1\VC\Tools\MSVC\1438~1.331\bin\Hostx64\x64\link.exe /nologo CMakeFiles\cmTC_8e63c.dir\testCCompiler.c.obj /out:cmTC_8e63c.exe /implib:cmTC_8e63c.lib /pdb:cmTC_8e63c.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
Active code page: 65001

RC Pass 1: command "rc /fo CMakeFiles\cmTC_8e63c.dir/manifest.res CMakeFiles\cmTC_8e63c.dir/manifest.rc" failed (exit code 0) with the following output:
系统找不到指定的文件。
ninja: build stopped: subcommand failed.

 

CMake will not be able to correctly generate this project. C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.27/Modules/CMakeTestCCompiler.cmake 67

 

 添加 

set(CMAKE_C_COMPILER_WORKS 1)

当前环境,没必要检查

关于 CMake“cmake is not able to compile a simple test program”错误 的解决方法_is not able to compile a simple test program.-CSDN博客 https://hpzwl.blog.csdn.net/article/details/111827832

严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息
错误 CMake Error at C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.27/Modules/CMakeTestCXXCompiler.cmake:60 (message):
The C++ compiler

"C:/msys64/ucrt64/bin/g++.exe"

is not able to compile a simple test program.

It fails with the following output:

Change Dir: 'D:/coding/myc/CMakeProject1/out/build/x64-debug/CMakeFiles/CMakeScratch/TryCompile-kcn4w6'

Run Build Command(s): "C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe" -v cmTC_a1117
[1/2] C:\msys64\ucrt64\bin\g++.exe -o CMakeFiles/cmTC_a1117.dir/testCXXCompiler.cxx.obj -c D:/coding/myc/CMakeProject1/out/build/x64-debug/CMakeFiles/CMakeScratch/TryCompile-kcn4w6/testCXXCompiler.cxx
[2/2] cmd.exe /C "cd . && C:\msys64\ucrt64\bin\g++.exe /machine:x64 CMakeFiles/cmTC_a1117.dir/testCXXCompiler.cxx.obj -o cmTC_a1117.exe -Wl,--out-implib,libcmTC_a1117.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
FAILED: cmTC_a1117.exe
cmd.exe /C "cd . && C:\msys64\ucrt64\bin\g++.exe /machine:x64 CMakeFiles/cmTC_a1117.dir/testCXXCompiler.cxx.obj -o cmTC_a1117.exe -Wl,--out-implib,libcmTC_a1117.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
Active code page: 65001
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find /machine:x64: No such file or directory

collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

 

CMake will not be able to correctly generate this project. C:/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.27/Modules/CMakeTestCXXCompiler.cmake 60

 添加 set(CMAKE_CXX_COMPILER_WORKS 1)

 

 

CMake 良心教程,教你从入门到入魂 - 知乎 https://zhuanlan.zhihu.com/p/500002865

CMake Tutorial — Mastering CMake https://cmake.org/cmake/help/book/mastering-cmake/cmake/Help/guide/tutorial/index.html

 

cmake_百度百科 https://baike.baidu.com/item/cmake/7138032?fr=aladdin

 

CMake 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。
“CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。
 
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。
 
中文名
cmake
外文名
cross platform make
类    型
跨平台的安装(编译)工具
描    述
所有平台的安装(编译过程)
功    能
可以编译源代码、制作程式库

目录

功能

CMake 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。
“CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。
 

历史

CMake是为了解决美国国家医学图书馆出资的Visible Human Project专案下的Insight Segmentation and Registration Toolkit (ITK) 软件的跨平台建构的需求而创造出来的,其设计受到了Ken Martin开发的pcmaker所影响。pcmaker当初则是为了支持Visualization Toolkit这个开放源代码的三维图形和视觉系统才出现的,今日VTK也采用了CMake。在设计CMake之时,Kitware公司的Bill Hoffman采用了pcmaker的一些重要想法,加上更多他自己的点子,想把GNU建构系统的一些功能整合进来。CMake最初的实作是在2000年中作的,在2001年初有了急速的进展,许多改良是来自其他把CMake整合到自己的系统中的开发者,比方说,采用CMake作为建构环境的VXL社群就贡献了很多重要的功能,Brad King为了支持CABLE和GCC-XML这套自动包装工具也加了几项功能,奇异公司的研发部门则用在内部的测试系统DART,还有一些功能是为了让VTK可以过渡到CMake和支持(“美国Los Alamos国家实验室”&“洛斯阿拉莫斯国家实验室”)的Advanced Computing Lab的平行视觉系统ParaView而加的。
 

组态档

组态档是用一种建构软件专用的特殊编程语言写的CMake脚本。
内建C语言、C++、Fortran、Java的自动相依性分析功能。
经由CMake脚本语言支持SWIG、Qt、FLTK。
内建对微软Visual Studio .NET和过去的Visual Studio版本的支持,可以产生后缀为.dsp、.sln和.vcproj的文档。
用传统的时间标签侦测档案内容的改变。
支持平行建构(在多台电脑上同时建构)
在许多操作系统上进行跨平台编译,包括Linux、POSIX相容的系统(AIX、*BSD、HP-UX、IRIX、MinGW/MSYSSolaris系统)、Mac OS X和微软Windows 95/98/NT/2000/XP等。
产生可以给Graphviz用的全局相依图。
已经和Dart、CTest和CPack等软件测试和释出的工具整合。
 
mysql-connector-cpp\jdbc.cmake
 
message("== Configuring legacy connector build using cmake generator: ${CMAKE_GENERATOR}")

if(NOT EXISTS "${PROJECT_SOURCE_DIR}/jdbc/CMakeLists.txt")
  message(FATAL_ERROR
    "Could not find JDBC API sources at ${PROJECT_SOURCE_DIR}/jdbc."
    " Have you updated git sub-modules?"
  )
endif()

set(JDBC_DIR "${PROJECT_BINARY_DIR}/jdbc")

if(FORCE_REBUILD AND EXISTS "${JDBC_DIR}/CMakeCache.txt")
  file(REMOVE ${JDBC_DIR}/CMakeCache.txt)
endif()
file(MAKE_DIRECTORY "${JDBC_DIR}")


#############################################################################
#
# Configure legacy connector build environment in ${JDBC_DIR}
#

if(BUILD_STATIC)
  list(APPEND jdbc_cmake_opts -DENABLE_BUILD_STATIC=ON)
else()
  list(APPEND jdbc_cmake_opts -DENABLE_BUILD_DYNAMIC=ON)
endif()

if(MAINTAINER_MODE)
  list(APPEND jdbc_cmake_opts -DENABLE_BUILD_STATIC=ON)
endif()

if(MYSQL_DIR)
  list(APPEND jdbc_cmake_opts -DMYSQL_DIR=${MYSQL_DIR})
endif()

if(MYSQL_CONFIG_EXECUTABLE)
  list(APPEND jdbc_cmake_opts -DMYSQL_CONFIG_EXECUTABLE=${MYSQL_CONFIG_EXECUTABLE})
endif()

list(APPEND jdbc_cmake_opts -DMYSQLCLIENT_STATIC_LINKING=ON)

if(CMAKE_BUILD_TYPE)
  if(CMAKE_BUILD_TYPE MATCHES "[Ss][Tt][Aa][Tt][Ii][Cc]")
    list(APPEND jdbc_cmake_opts -DCMAKE_BUILD_TYPE=Release)
  else()
    list(APPEND jdbc_cmake_opts -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE})
  endif()
endif()

if(DEFINED STATIC_MSVCRT)
  list(APPEND jdbc_cmake_opts -DSTATIC_MSVCRT=${STATIC_MSVCRT})
endif()

if(VS)
  list(APPEND jdbc_cmake_opts -DVS=${VS})
endif()

#
# Find Boost which is required by legacy connector
#

include(boost)
list(APPEND jdbc_cmake_opts -DBOOST_ROOT=${BOOST_ROOT})

#
# Generate version info for legacy connector
#

configure_file(
  "${PROJECT_SOURCE_DIR}/jdbc/VersionInfo.cmake.in"
  "${JDBC_DIR}/VersionInfo.cmake"
  @ONLY
)

# Dirty trick to speed up cmake set up time.

file(
  COPY "${CMAKE_BINARY_DIR}/CMakeFiles/${CMAKE_VERSION}"
  DESTINATION "${JDBC_DIR}/CMakeFiles"
)

if(1)
execute_process(
  COMMAND ${CMAKE_COMMAND} -Wno-dev
          -G "${CMAKE_GENERATOR}"
          ${jdbc_cmake_opts}
          -DCMAKE_INSTALL_PREFIX=${JDBC_DIR}/install
          -DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}
          -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
          -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
          ${PROJECT_SOURCE_DIR}/jdbc
  WORKING_DIRECTORY ${JDBC_DIR}
  RESULT_VARIABLE jdbc_config
)
endif()

if(jdbc_config)
  message(FATAL_ERROR "Could not configure legacy connector build: ${jdbc_config}")
endif()


#############################################################################
#
# Target build_jdbc which triggers build and installation of the legacy
# connector.
#

#
#  jdbc.buildstamp
#

set(JDBC_BUILD_STAMP "${PROJECT_BINARY_DIR}/jdbc.buildstamp")
file(REMOVE "${JDBC_BUILD_STAMP}")
#message("JDBC_BUILD_STAMP: ${JDBC_BUILD_STAMP}")

set(CONFIG_EXPR
  $<$<CONFIG:Static>:Release>$<$<NOT:$<CONFIG:Static>>:$<CONFIGURATION>>
)

add_custom_command(OUTPUT ${JDBC_BUILD_STAMP}

  COMMAND ${CMAKE_COMMAND} -E remove_directory install
  COMMAND ${CMAKE_COMMAND}
    --build . --target install --config ${CONFIG_EXPR} --clean-first

  # Move installed headers from include/ to include/jdbc and rename lib/
  # to lib64/ for 64-bit platform

  COMMAND ${CMAKE_COMMAND} -E remove_directory install/jdbc
  COMMAND ${CMAKE_COMMAND} -E rename install/include install/jdbc
  COMMAND ${CMAKE_COMMAND} -E make_directory install/include
  COMMAND ${CMAKE_COMMAND} -E copy_directory install/jdbc install/include/jdbc
  COMMAND ${CMAKE_COMMAND} -E remove_directory install/jdbc

  COMMAND ${CMAKE_COMMAND} -E touch ${JDBC_BUILD_STAMP}

  WORKING_DIRECTORY ${JDBC_DIR}
  COMMENT "Building legacy connector library using configuration: $(Configuration)"
)

# Collect sources of legacy connector and specify them in the build
# target.

unset(jdbc_sources)
foreach(dir driver cppconn thread)

  file(
    GLOB_RECURSE sources
    #RELATIVE "${PROJECT_SOURCE_DIR}/jdbc/${dir}"
    "${PROJECT_SOURCE_DIR}/jdbc/${dir}/*.cpp"
    "${PROJECT_SOURCE_DIR}/jdbc/${dir}/*.h"
    "${PROJECT_SOURCE_DIR}/jdbc/${dir}/*.cmake"
    "${PROJECT_SOURCE_DIR}/jdbc/${dir}/*.cm"
    "${PROJECT_SOURCE_DIR}/jdbc/${dir}/CMakeLists.txt"
  )

  # TODO: Split into Headers/Sources/Other sub-groups

  source_group(${dir} FILES ${sources})

  list(APPEND jdbc_sources ${sources})

endforeach()

add_custom_target(build_jdbc ALL
  DEPENDS ${JDBC_BUILD_STAMP}
  SOURCES ${jdbc_sources}
)


#############################################################################
#
# Import legacy connector library so that it can be used by other targets.
#

set(JDBC_INCLUDES ${Boost_INCLUDE_DIRS} "${JDBC_DIR}/install/include")
#message("legacy connector includes: ${JDBC_INCLUDES}")

#
# Import library targets exported from the legacy connector project.
#

include("${JDBC_DIR}/exports.cmake")

if(BUILD_STATIC)
  set(JDBC_LIB mysqlcppconn-static)
else()
  set(JDBC_LIB mysqlcppconn)
endif()

add_dependencies(${JDBC_LIB} build_jdbc)

set(JDBC_LIBS ${JDBC_LIB} CACHE INTERNAL "legacy connector library")


#############################################################################
#
# Installation specs for the legacy connector
#

get_target_property(configurations ${JDBC_LIB} IMPORTED_CONFIGURATIONS)

foreach(config ${configurations})

  get_target_property(location ${JDBC_LIB} IMPORTED_LOCATION_${config})
  message("jdbc installing: ${location}")

  if(config STREQUAL DEBUG)
    set(loc "${INSTALL_LIB_DIR}/debug")
    set(loc_static "${INSTALL_LIB_DIR_STATIC}/debug")
  else()
    set(loc "${INSTALL_LIB_DIR}")
    set(loc_static "${INSTALL_LIB_DIR_STATIC}")
  endif()

  if(BUILD_STATIC)

    install(
      FILES ${location}
      CONFIGURATIONS ${config}
      DESTINATION ${loc_static}
      COMPONENT JDBCDev
    )

  else()

    if(WIN32)

      install(FILES ${location} CONFIGURATIONS ${config} DESTINATION ${loc} COMPONENT JDBCDll)

      # install import library for the DLL

      get_target_property(imp_location ${JDBC_LIB} IMPORTED_IMPLIB_${config})

      install(
        FILES ${imp_location}
        CONFIGURATIONS ${config}
        DESTINATION ${loc_static}
        COMPONENT JDBCDev
      )

    else()

      # We need to install soname and linkname links together with the shared
      # library.

      get_filename_component(name "${location}" NAME)
      get_filename_component(loc_path "${location}" PATH)
      get_target_property(soname ${JDBC_LIB} IMPORTED_SONAME_${config})
      set(linkname "${CMAKE_SHARED_LIBRARY_PREFIX}mysqlcppconn${CMAKE_SHARED_LIBRARY_SUFFIX}")

      #
      # Warning: Using undocumented file(INSTALL ...) signature which creates
      # required symlinks. This command is used in install scripts generated
      # by cmake.
      #

      install(CODE
       "file(INSTALL
          DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${loc}\"
          TYPE SHARED_LIBRARY
          FILES
            \"${location}\"
            \"${loc_path}/${soname}\"
            \"${loc_path}/${linkname}\"
       )"
      )

    endif()

  endif()

endforeach()


install(
  DIRECTORY ${JDBC_DIR}/install/include/jdbc
  DESTINATION ${INSTALL_INCLUDE_DIR}
  COMPONENT JDBCDev
)

#
# In maintainer mode add specifications for installing the static library
# which is always built in this mode.
#

if(MAINTAINER_MODE)

  add_dependencies(mysqlcppconn-static build_jdbc)
  get_target_property(location mysqlcppconn-static IMPORTED_LOCATION_RELEASE)
  message("jdbc installing: ${location} (MAINTAINER_MODE)")

  install(
    FILES ${location}
    CONFIGURATIONS Static
    DESTINATION "${INSTALL_LIB_DIR_STATIC}"
    COMPONENT JDBCDev
  )

endif()


#
#  Install external dependencies of MySQL client library, such as OpenSSL,
#  if bundled with client library installation.
#
#  Note: if main connector uses OpenSSL, then we will use the same libraries
#  to satisfy client library dependency. But if main connector does not use
#  OpenSSL, we copy required dependencies from MySQL installation.
#

if(BUNDLE_DEPENDENCIES AND WITH_SSL STREQUAL "bundled")

  message("Bundling OpenSSL libraries from: ${MYSQL_DIR}")

  install(DIRECTORY "${MYSQL_DIR}/bin/" DESTINATION lib64
    FILES_MATCHING PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}"
    COMPONENT JDBCDev
  )

endif()

#############################################################################
#
#  Public header checks
#

if(WITH_HEADER_CHECKS)

  # Prepare location where checks will be performed.

  set(CHECK_DIR "${JDBC_DIR}/headers_check")

  file(REMOVE_RECURSE "${CHECK_DIR}")
  file(MAKE_DIRECTORY "${CHECK_DIR}")

  # Dirty trick to speed up cmake set up time.

  file(
    COPY "${CMAKE_BINARY_DIR}/CMakeFiles/${CMAKE_VERSION}"
    DESTINATION "${CHECK_DIR}/CMakeFiles"
  )

  #
  # Target to run header checks.
  #

  ADD_CUSTOM_TARGET(Headers_jdbc
    COMMAND ${CMAKE_COMMAND}
      -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
      -DJDBC_DIR=${JDBC_DIR}
      -DJDBC_INCLUDES="${JDBC_INCLUDES}"
      -DHEADERS_DIR=${PROJECT_SOURCE_DIR}/cdk/cmake/headers
      -DCHECK_DIR=${CHECK_DIR}
      -P ${PROJECT_SOURCE_DIR}/cmake/jdbc_headers_check.cmake
    SOURCES ${all_headers}
  )

  add_dependencies(Headers_jdbc build_jdbc)


  add_test(NAME Headers_jdbc
    COMMAND cmake --build . --target Headers_jdbc
    WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
  )
  message(STATUS "Added JDBC public headers test")

endif()

message("== legacy connector build configured")

  

 

 

 

posted @ 2018-10-25 08:22  papering  阅读(678)  评论(0)    收藏  举报