CMakeList实战

2023-11-04

1 FIND_PACKAGE

FIND_PACKAGE( <name> [version] [EXACT] [QUIET] [NO_MODULE] [ [ REQUIRED | COMPONENTS ] [ componets... ] ] )

用来调用预定义在 CMAKE_MODULE_PATH 下的 Find<name>.cmake 模块。

也可以自己定义 Find<name>模块,将其放入工程的某个目录中,通过 SET(CMAKE_MODULE_PATH dir)设置查找路径,供工程FIND_PACKAGE使用。

这条命令执行后,CMake 会到变量 CMAKE_MODULE_PATH 指示的目录中查找文件 Findname.cmake 并执行。

version参数

需要一个版本号,它是正在查找的包应该兼容的版本号(格式是major[.minor[.patch[.tweak]]])。

EXACT选项

要求版本号必须精确匹配。如果在find-module内部对该命令的递归调用没有给定[version]参数,那么[version]和EXACT选项会自动地从外部调用前向继承。对版本的支持目前只存在于包和包之间(详见下文)。

QUIET 参数:

会禁掉包没有被发现时的警告信息。对应于Find<name>.cmake模块中的 NAME_FIND_QUIETLY。

REQUIRED 参数

其含义是指是否是工程必须的,表示如果报没有找到的话,cmake的过程会终止,并输出警告信息。对应于Find<name>.cmake模块中的 NAME_FIND_REQUIRED 变量。

COMPONENTS参数

在REQUIRED选项之后,或者如果没有指定REQUIRED选项但是指定了COMPONENTS选项,在它们的后面可以列出一些与包相关(依赖)的部件清单(components list)

示例:

FIND_PACKAGE( libdb_cxx REQUIRED)

这条命令执行后,CMake 会到变量 CMAKE_MODULE_PATH 指示的目录中查找文件 Findlibdb_cxx.cmake 并执行。

# CMake要求的最低版本号
cmake_minimum_required( VERSION 2.8 )

# 项目名称
project( ycm_support_libs )
# 设置客户端lib和服务端lib的变量名称
set( CLIENT_LIB "ycm_client_support" )
set( SERVER_LIB "ycm_core" )

# 设置Python的版本号变量
set( Python_ADDITIONAL_VERSIONS 2.7 2.6 )
# 进行Python包的查找,这里是REQUIRED表示必须
find_package( PythonLibs 2.6 REQUIRED )

# 如果Python版本号低于3.0.0就进行FATAL_ERROR的出错信息
if ( NOT PYTHONLIBS_VERSION_STRING VERSION_LESS "3.0.0" )
  message( FATAL_ERROR
    "CMake found python3 libs instead of python2 libs. YCM works only with "
    "python2.\n" )
endif()

# 各种option
option( USE_DEV_FLAGS "Use compilation flags meant for YCM developers" OFF )
# 这个变量就是我上文讲到的很关键的一个变量,来判断当前用户需要不需要libclang
option( USE_CLANG_COMPLETER "Use Clang semantic completer for C/C++/ObjC" OFF )
# install.sh中的--system-libclang就与这个变量进行交互
option( USE_SYSTEM_LIBCLANG "Set to ON to use the system libclang library" OFF )
# YCM作者推荐的用法,在这里直接写入Clang的相关路径 注意这里的CACHE PATH,表示当用户如果命令行
# 进行指定,那优先会去读用户的命令行,而不是用这里的set,并且把相关的值写入Cache中
set( PATH_TO_LLVM_ROOT "" CACHE PATH "Path to the root of a LLVM+Clang binary distribution" )
# YCM作者推荐的另外一种安装方法,直接将libclang.so全路径写死
set( EXTERNAL_LIBCLANG_PATH "" CACHE PATH "Path to the libclang library to use" )

# 如果你使用libclang但是没有指定用不用系统的libclang,没有指定llvm_root,没有指定额外的libclang.so,那么就会带你去下载
if ( USE_CLANG_COMPLETER AND
     NOT USE_SYSTEM_LIBCLANG AND
     NOT PATH_TO_LLVM_ROOT AND
     NOT EXTERNAL_LIBCLANG_PATH )
  message( "Downloading Clang 3.4" )

  # 这就是llvm官网的3.4下载路径
  set( CLANG_URL "http://llvm.org/releases/3.4" )

  # 如果当前客户端是苹果 Mac OS X
  if ( APPLE )
      # 设置Clang的文件夹名称
    set( CLANG_DIRNAME "clang+llvm-3.4-x86_64-apple-darwin10.9" )
      # 设置Clang的MD5校验码
    set( CLANG_MD5 "4f43ea0e87090ae5e7bec12373ca4927" )
      # 设置Clang文件名称为之后加上tar.gz
    set( CLANG_FILENAME "${CLANG_DIRNAME}.tar.gz" )
  else()
      # 如果是64位平台
    if ( 64_BIT_PLATFORM )
      # 设置Clang的文件夹名称
      set( CLANG_DIRNAME "clang+llvm-3.4-x86_64-unknown-ubuntu12.04" )
      # 设置Clang的MD5校验码
      set( CLANG_MD5 "6077459d20a7ff412eefc6ce3b9f5c85" )
      # 设置Clang文件名称为之后加上tar.gz
      set( CLANG_FILENAME "${CLANG_DIRNAME}.tar.xz" )
    else()
      # 表示此时为32位的Linux,下载3.3版本
      message( "No pre-built Clang 3.4 binaries for 32 bit linux, "
               "downloading Clang 3.3" )
      set( CLANG_URL "http://llvm.org/releases/3.3" )
      # 设置Clang的文件夹名称
      set( CLANG_DIRNAME "clang+llvm-3.3-i386-debian6" )
      # 设置Clang的MD5校验码
      set( CLANG_MD5 "415d033b60659433d4631df894673802" )
      # 设置Clang文件名称为之后加上tar.gz
      set( CLANG_FILENAME "${CLANG_DIRNAME}.tar.bz2" )
    endif()
  endif()

      # 下载命令
  file(
    DOWNLOAD "${CLANG_URL}/${CLANG_FILENAME}" "./${CLANG_FILENAME}"
    SHOW_PROGRESS EXPECTED_MD5 "${CLANG_MD5}"
  )

  # 文件名正则表达式匹配,进行相应的解压
  if ( CLANG_FILENAME MATCHES ".+bz2" )
      # 执行相关的外部命令 tar
    execute_process( COMMAND tar -xjf ${CLANG_FILENAME} )
  elseif( CLANG_FILENAME MATCHES ".+xz" )
    execute_process( COMMAND tar -xJf ${CLANG_FILENAME} )
  else()
    execute_process( COMMAND tar -xzf ${CLANG_FILENAME} )
  endif()

  # 设置PATH_TO_LLVM_ROOT的路径为当前CMake二进制路径下的Clang目录
  set( PATH_TO_LLVM_ROOT "${CMAKE_CURRENT_BINARY_DIR}/../${CLANG_DIRNAME}" )
endif()

# 如果设置了PATH_TO_LLVM_ROOT或者用户使用系统libclang或者有额外的libclang,就开启USE_CLANG_COMPLETER
# 这个变量我上文提过,很关键
if ( PATH_TO_LLVM_ROOT OR USE_SYSTEM_LIBCLANG OR EXTERNAL_LIBCLANG_PATH )
  set( USE_CLANG_COMPLETER TRUE )
endif()

# 开始使用这个变量,如果用户确定使用libclang,但是没有root没有系统clang没有额外clang,那么
# 进行错误性提示
if ( USE_CLANG_COMPLETER AND
     NOT PATH_TO_LLVM_ROOT AND
     NOT USE_SYSTEM_LIBCLANG AND
     NOT EXTERNAL_LIBCLANG_PATH )
  message( FATAL_ERROR
    "You have not specified which libclang to use. You have several options:\n"
    " 1. Set PATH_TO_LLVM_ROOT to a path to the root of a LLVM+Clang binary "
    "distribution. You can download such a binary distro from llvm.org. This "
    "is the recommended approach.\n"
    " 2. Set USE_SYSTEM_LIBCLANG to ON; this makes YCM search for the system "
    "version of libclang.\n"
    " 3. Set EXTERNAL_LIBCLANG_PATH to a path to whatever "
    "libclang.[so|dylib|dll] you wish to use.\n"
    "You HAVE to pick one option. See the docs for more information.")
endif()

# 进行用户提醒,提醒用户当前是否使用libclang
if ( USE_CLANG_COMPLETER )
  message( "Using libclang to provide semantic completion for C/C++/ObjC" )
else()
  message( "NOT using libclang, no semantic completion for C/C++/ObjC will be "
           "available" )
endif()

# 如果设置了root就设置CLANG_INCLUDES_DIR为root下的include
# 否则CLANG_INCLUDES_DIR为CMake下llvm/include
if ( PATH_TO_LLVM_ROOT )
  set( CLANG_INCLUDES_DIR "${PATH_TO_LLVM_ROOT}/include" )
else()
  set( CLANG_INCLUDES_DIR "${CMAKE_SOURCE_DIR}/llvm/include" )
endif()

# 如果当前的include路径不是绝对路径
if ( NOT IS_ABSOLUTE "${CLANG_INCLUDES_DIR}" )
    # 设置它为绝对路径
  get_filename_component(CLANG_INCLUDES_DIR
    "${CMAKE_BINARY_DIR}/${CLANG_INCLUDES_DIR}" ABSOLUTE)
endif()

# 如果没有额外的libclang,但是有root
if ( NOT EXTERNAL_LIBCLANG_PATH AND PATH_TO_LLVM_ROOT )
    if ( MINGW ) # 如果是MINGW
        # 设置libclang的寻找路径(后面的find_library会去寻找)
    set( LIBCLANG_SEARCH_PATH "${PATH_TO_LLVM_ROOT}/bin" )
  else()
    set( LIBCLANG_SEARCH_PATH "${PATH_TO_LLVM_ROOT}/lib" )
  endif()

  # 这里TEMP会被find_library去寻找clang,和libclang两个so,并且复制路径给TEMP
  find_library( TEMP NAMES clang libclang
                PATHS ${LIBCLANG_SEARCH_PATH}
                NO_DEFAULT_PATH )

            message("temp is ${TEMP}")
            # 设置额外的libclang为这个路径
  set( EXTERNAL_LIBCLANG_PATH ${TEMP} )
endif()

 # 如果当前为苹果,设置额外的flag
if ( APPLE )
  set( CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem " )
endif()

# 如果用户使用系统自带的boost
if ( USE_SYSTEM_BOOST )
    # 进行find boost命令,会用到python,filesystem,system,regex,thread等components
  find_package( Boost REQUIRED COMPONENTS python filesystem system regex thread )
else()
    # 使用自己的Boost
  set( Boost_INCLUDE_DIR ${BoostParts_SOURCE_DIR} )
  set( Boost_LIBRARIES BoostParts )
endif()

 # 相关头文件的加入,Boost,Python和Clang
include_directories(
  SYSTEM
  ${Boost_INCLUDE_DIR}
  ${PYTHON_INCLUDE_DIRS}
  ${CLANG_INCLUDES_DIR}
  )

# 全局递归查找h,cpp文件给SERVER_SOURCES
file( GLOB_RECURSE SERVER_SOURCES *.h *.cpp )

# 全局递归查找测试相关文件
file( GLOB_RECURSE to_remove tests/*.h tests/*.cpp CMakeFiles/*.cpp *client* )

if( to_remove )
    # 学习list相关的REMOVE_ITEM命令
  list( REMOVE_ITEM SERVER_SOURCES ${to_remove} )
endif()

# 这里就是这个变量最关键的地方,它会去include并且开启宏
if ( USE_CLANG_COMPLETER )
  include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
    "${CMAKE_CURRENT_SOURCE_DIR}/ClangCompleter" )
  add_definitions( -DUSE_CLANG_COMPLETER )
else()
    # 否则的话寻找所有ClangCompleter下的头和源文件进行删除
  file( GLOB_RECURSE to_remove_clang ClangCompleter/*.h ClangCompleter/*.cpp )

  if( to_remove_clang )
    list( REMOVE_ITEM SERVER_SOURCES ${to_remove_clang} )
  endif()
endif()

# 如果用户使用额外的libclang或者使用系统自带的libclang
if ( EXTERNAL_LIBCLANG_PATH OR USE_SYSTEM_LIBCLANG )
  if ( USE_SYSTEM_LIBCLANG ) # 如果是系统自带
    if ( APPLE )
        set( ENV_LIB_PATHS ENV DYLD_LIBRARY_PATH ) # 将环境变量下的DYLD_LIBRARY_PATH给ENV_LIB_PATHS
    elseif ( UNIX )
      set( ENV_LIB_PATHS ENV LD_LIBRARY_PATH ) # 这也是我之前讲的一定要把你编译的libclang加入到这个环境变量中,因为它会根据这个去寻找
  elseif ( WIN32 )
      set( ENV_LIB_PATHS ENV PATH )
    else ()
      set( ENV_LIB_PATHS "" )
    endif()
    file( GLOB SYS_LLVM_PATHS "/usr/lib/llvm*/lib" )

    # 进行相关的libclang查找,在你之前给它指定的环境变量中
    find_library( TEMP clang
                  PATHS
                  ${ENV_LIB_PATHS}
                  /usr/lib
                  /usr/lib/llvm
                  ${SYS_LLVM_PATHS}
                  /Library/Developer/CommandLineTools/usr/lib,
                  /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib )
              # 将寻找到的变量给EXTERNAL_LIBCLANG_PATH
    set( EXTERNAL_LIBCLANG_PATH ${TEMP} )
  else()
    if ( NOT APPLE )
      # 设置相关rpath
      set( CMAKE_BUILD_WITH_INSTALL_RPATH TRUE )
      # 设置make install之后的rpath
      set( CMAKE_INSTALL_RPATH "\$ORIGIN" )
    endif()
  endif()

  set( LIBCLANG_TARGET "" )
  message(
    "Using external libclang: ${EXTERNAL_LIBCLANG_PATH}" )
message("libclang_target is ${LIBCLANG_TARGET}")
else()
  set( LIBCLANG_TARGET )
endif()

# 如果有额外的rpath,在这里进行设置
if ( EXTRA_RPATH )
  set( CMAKE_INSTALL_RPATH "${EXTRA_RPATH}:${CMAKE_INSTALL_RPATH}" )
endif()

# 如果在Linux下需要额外的rt库
if ( UNIX AND NOT APPLE )
  set( EXTRA_LIBS rt )
endif()

# 将目录下所有的h和cpp给CLIENT_SOURCES
file( GLOB CLIENT_SOURCES *.h *.cpp )
# 相应SERVER_SPECIFIC赋值
file( GLOB SERVER_SPECIFIC *ycm_core* )

if( SERVER_SPECIFIC )
    # 移除相关CLIEN_SOURCES下的SERVER_SPECIFIC
  list( REMOVE_ITEM CLIENT_SOURCES ${SERVER_SPECIFIC} )
endif()

# 创建client的library,并且是动态库
add_library( ${CLIENT_LIB} SHARED
             ${CLIENT_SOURCES}
           )

       # 将这个库与之前的rt,Boost,Python进行链接
target_link_libraries( ${CLIENT_LIB}
                       ${Boost_LIBRARIES}
                       ${PYTHON_LIBRARIES}
                       ${EXTRA_LIBS}
                     )

# 创建server的library,并且是动态库
add_library( ${SERVER_LIB} SHARED
             ${SERVER_SOURCES}
           )

       # 将这个库与之前的rt,Boost,Python,libclang,而外的server lib进行链接
target_link_libraries( ${SERVER_LIB}
                       ${Boost_LIBRARIES}
                       ${PYTHON_LIBRARIES}
                       ${LIBCLANG_TARGET}
                       ${EXTRA_LIBS}
                     )

# 如果定义了LIBCLANG_TARGET
if( LIBCLANG_TARGET )
  if( NOT WIN32 )
      # 在非WIN32情况下增加自定义命令,将libclang.so/dll拷贝到自己目录下
    add_custom_command(
      TARGET ${SERVER_LIB}
      POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy "${LIBCLANG_TARGET}" "$<TARGET_FILE_DIR:${SERVER_LIB}>"
    )
  else()
    add_custom_command(
      TARGET ${SERVER_LIB}
      POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy "${PATH_TO_LLVM_ROOT}/bin/libclang.dll" "$<TARGET_FILE_DIR:${SERVER_LIB}>")
  endif()
endif()

# 建立依赖关系,表示这个项目需要这两个库共同完成
add_custom_target( ${PROJECT_NAME}
                   DEPENDS ${CLIENT_LIB} ${SERVER_LIB} )

# Mac下的相关设置,如果是利用rpath的话Mac下还是会去寻找系统库,即使用户显示指定
# 这里需要改用@loader_path
if ( EXTERNAL_LIBCLANG_PATH AND APPLE )
  add_custom_command( TARGET ${SERVER_LIB}
                      POST_BUILD
                      COMMAND install_name_tool
                      "-change"
                      "@rpath/libclang.dylib"
                      "@loader_path/libclang.dylib"
                      "$<TARGET_FILE:${SERVER_LIB}>"
                    )
endif()

# 将这些库的前缀lib去掉,因为会扰乱Python模块的查找
set_target_properties( ${CLIENT_LIB} PROPERTIES PREFIX "")
set_target_properties( ${SERVER_LIB} PROPERTIES PREFIX "")

if ( WIN32 OR CYGWIN )
    # 进行Windows下相关库的转移存放
  set_target_properties( ${CLIENT_LIB} PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../.. )
  set_target_properties( ${SERVER_LIB} PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../.. )
  foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set_target_properties( ${CLIENT_LIB} PROPERTIES
      RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_SOURCE_DIR}/../.. )
    set_target_properties( ${SERVER_LIB} PROPERTIES
      RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_SOURCE_DIR}/../.. )
  endforeach()

  if ( WIN32 )
    # 建立后缀名.pyd
    set_target_properties( ${CLIENT_LIB} PROPERTIES SUFFIX ".pyd")
    set_target_properties( ${SERVER_LIB} PROPERTIES SUFFIX ".pyd")
  elseif ( CYGWIN )
    # CYGIN下后缀为dll
    set_target_properties( ${CLIENT_LIB} PROPERTIES SUFFIX ".dll")
    set_target_properties( ${SERVER_LIB} PROPERTIES SUFFIX ".dll")
  endif()
else()
  # Mac和Linux下都为.so,虽然Mac下应该默认为.dylib,但Python识别不了dylib,因此这里还是设置成.so
  set_target_properties( ${CLIENT_LIB} PROPERTIES SUFFIX ".so")
  set_target_properties( ${SERVER_LIB} PROPERTIES SUFFIX ".so")
endif()

 # 设置相关lib的输出目录
set_target_properties( ${CLIENT_LIB} PROPERTIES
  LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../.. )
set_target_properties( ${SERVER_LIB} PROPERTIES
  LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../.. )

if ( USE_DEV_FLAGS AND ( CMAKE_COMPILER_IS_GNUCXX OR COMPILER_IS_CLANG ) AND
     NOT CMAKE_GENERATOR_IS_XCODE )
  # 增加相应flag
  set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror" )
endif()

# 提出警告在使用C++11特性下
if ( USE_DEV_FLAGS AND COMPILER_IS_CLANG AND NOT CMAKE_GENERATOR_IS_XCODE AND
     NOT SYSTEM_IS_FREEBSD )
  set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wc++98-compat" )
endif()

if( SYSTEM_IS_SUNOS )
    # SunOS需要-pthreads这个flag才能正常使用
  set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthreads" )
endif()

# 增加测试子目录tests
add_subdirectory( tests )

转自:https://www.cnblogs.com/rickyk/p/3877238.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMakeList实战 的相关文章

  • CMake项目中神器:CMakeLists.txt

    首次接触 CMake xff0c 见识了 CMakeLists txt 的强大后 xff0c 赶紧整理出来分享一下 参考资料 xff1a Cmake 3 6 W3Cschool参考手册 本文讲述了一个 CMake 项目 xff0c 在从单文
  • PX4 CMakeLists.txt 文件剖析

    PX4 CMakeLists txt 文件剖析 前面对于 PX4 的 Makefile 已经做了比较详细的分析 见这里 这里进一步对 PX4 的 CMakeLists txt 文件结构进行进一步的分析 1 CMake 简述 CMake 是一
  • Record: My CMakeLists

    1 设置需要的最小版本的cmake cmake minimum required VERSION 3 10 2 定义生成的项目名 project perceive tracking 3 1 设置cmake参数 set CMAKE CXX F
  • Android.mk 和 CMakeLists.txt 的转换规则

    Android mk 和 CMakeLists txt 都是用来构建 Android 应用程序或库的工具 但是它们有不同的语法和规则 xff0c 所以将一个 Android mk 文件转换成一个 CMakeLists txt 文件需要一些注
  • 3.编写CMakeLists文件

    本章将介绍为您的软件编写有效的 CMakeLists 文件的基础知识 它将涵盖处理大多数项目所需的基本命令和问题 虽然 CMake 可以处理极其复杂的项目 xff0c 但对于大多数项目 xff0c 你会发现本章的内容会告诉你所有你需要知道的
  • cmake, make, CMakeLists.txt, Makefile简介

    文章目录 cmake make CMakeList txt Makefile之间的关系参考文章链接 xff1a 转自个人博客 在各种开源项目中 xff0c 经常会发现项目中除了代码源文件 xff0c 还包含了 CMakeList txt M
  • cmake学习1:基本的CMakeLists的编写

    前言 自己在使用cmake进行编译工程的时候不太了解cmake的基本使用方法 有时候出现找不到第三方库的问题也不知如何排查 因此相对cmake有个稍微系统的认识 希望能用这个强大的工具来更好的为自己的工程服务 因此总结为了几篇博客 主要参考
  • Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    简述 xff1a CMake是一个跨平台的安装 编译 工具 可以用简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的makefile或者project文件 能测试编译器所支持的C 43 43 特性 类似UNIX下的automak
  • 关于Cmake与CmakeLists(一)--背景,须知,示例

    一 背景及须知 1 背景 xff1a VS2019与VS2010在编写程序时都是创建了一个工程 xff0c 然后直接打开 sln即可 但是vscode仅仅是一个编辑器 xff0c 打开之后只有 c或者 cpp文件 xff0c 故需要手动编译
  • ROS CMakeLists.txt中的 target_link_libraries

    span class token function target link libraries span span class token punctuation span span class token punctuation span
  • cmake & CMakeLists.txt

    文章目录 前言先从体验开始1 一个最简单的例子 xff1a 2 例子升级 xff0c 将hello c生成为一个库 xff1a 3 例子升级 xff0c 将源代码和库分开放 xff1a 4 让可执行文件在 bin 目录 xff0c 库文件在
  • ORB_SLAM2 CMakeLIsts文件注释

    最近在学习ORB SLAM 发现基本找不到CMakeLists的代码注释 就决定自己注释一份 如果发现有问题的地方 欢迎和我交流 span class token function cmake minimum required span s
  • qt程序的CMakeLists.txt配置转为平台的qt的.pro项目工程文件

    参考这个 跨平台qt程序的CMakeLists txt配置转为平台的qt的 pro项目工程文件 谁能懂我2011的博客 CSDN博客 一些比较正规的跨平台qt项目没有 pro项目文件只有CMakeLists txt文件 xff0c 如果要编
  • 关于GD32的CMakeLists以及gcc部分编译选项的解释

    set CMAKE SYSTEM NAME Generic cmake最低版本 cmake minimum required VERSION 3 0 0 工程名称 语言 project TEST PRJ NAME LANGUAGES C C
  • gcc、make、makefile、cmake、cmakelists区别

    转自 xff1a http www zhihu com question 36609459 辉常哥 1 gcc是GNU Compiler Collection xff08 就是GNU编译器套件 xff09 xff0c 也可以简单认为是编译器
  • ROS2 + Qt5 cmake的CMakeLists.txt文件配置

    ROS2 QT实现学习笔记 1 1 功能包的创建和编译 ROS2 Foxy 43 Qt5 on Linux Platform 按上面两个文章配置后的目录结构 build CMakeLists txt include mainwindow h
  • NDK--CMakeLists配置第三方so库

    当我们创建一个NDK工程时 xff0c 会自动创建一个CMakeLists txt的文件 xff0c 在AS中c 43 43 的编译器是使用LLVM xff0c 规则为cmake xff0c 今天来学习下cmake的基本套路 首先 xff0
  • Ubuntu下使用CMakeLists.txt管理C/C++代码

    Ubuntu下使用CMakeLists txt管理C C 43 43 代码 一 CMakeLists txt入门知识1 CMakeLists txt的编译方法2 CMakeLists txt的文件内容3 编译的C文件 二 CMakeList
  • CMake与CMakeLists是干什么的?

    写在最前面 xff1a 所有的博文都是为了若干年月以后当我再次翻看可以快速回想起之前的零星知识 学海无涯 xff0c 在看这篇文章的未来的你 xff0c 加油吧 xff01 因为之前看到有些软件中使用了CMake xff0c 不太理解为什么
  • cmake与make的区别及CMakeLists.txt文件编写

    一 cmake与make的区别 make工具是一个自动化编译工具 xff0c 它会根据Makefile中的规则进行批处理编译 当需要编译的文件较多时 xff0c 使用make工具会大大提高效率 但是 xff0c 当项目较大时 xff0c 编

随机推荐

  • 单片机 嵌入式 毕业设计题目选题推荐

    文章目录 1前言 2 如何选题 2 1 不要给自己挖坑 2 2 难度把控 2 3 如何命名题目 3 单片机 嵌入式 选题大全 3 1 嵌入式方向 3 2 算法方向 3 3 移动通信方向 3 4 学长作品展示 4 最后 1前言 近期不少学弟学
  • 子类的构造函数和析构函数

    1 构造函数是否可以被继承 子类可以继承父类的所有成员变量和成员函数 但不能继承父类的构造函数 因此 在创建子类对象时 为了初始化从父类继承来的数据成员 系统需要调用其父类的额构造函数 2 父类构造函数的调用规则 如果子类没有定义构造函数
  • axios的三层封装思想

    1 工具函数层 设置默认请求地址 设置默认超时时间 设置默认请求拦截 设置默认响应拦截 ajax工具函数层 import axios from axios axios defaults baseURL http localhost 5000
  • vue2插件开发小试

    开发vue插件的官方文档是这样描述的 插件通常会为Vue添加全局功能 插件的范围没有限制 一般有下面几种 1 添加全局方法或者属性 如 vue element 2 添加全局资源 指令 过滤器 过渡等 如 vue touch 3 通过全局 m
  • KDD 2023

    下载地址 点我跳转 1 DoubleAdapt A Meta learning Approach to Incremental Learning for Stock Trend Forecasting Code None Area 一种用于
  • ubuntu 安装Pangolin 过程

    前言 大家好 好久没有写技术博客了 在工作学习中遇到一些问题及解决方法 希望能帮助到大家 Pangolin 想必大家都非常熟悉了 这个是一款开源的OPENGL显示库 可以用来视频显示 而且开发容易 代码我们可以从Github 进行下载 ht
  • JSP基础语法

    1 gt 2 gt hr
  • C++(13)——STl之List的实现

    STL STL是C 的标准模板库 是一个具有工业强度 高效的C 程序库 STL一个最为重要的特点就是数据结构和算法的分离 你可以使用其中的一些函数操作几乎热河的数据集合 包含链表 容器和数组 STL的另一个特性就是它不是面向对象的 STL主
  • 【环境配置】安装 Visual Studio 2022 Community 卡住了&& 安装 Windows SDK (Software Development Kits)卡住了

    问题原因 a 系统升级了 b 之前卸载没卸载干净 注册表里存在旧的信息 解决过程 1 查看日志 在资源管理器中输入 TEMP windowssdk 查看日志文件 找到最新的日志文件 在文件中搜索 Warning 出现了一组长串数字 用 括起
  • 基于Matlab小车倒立摆系统的控制(附上完整源码+数据)

    本文介绍了如何使用Matlab对小车倒立摆系统进行控制 倒立摆是一种经典的控制系统问题 通过控制小车的速度和方向 实现倒立摆的平衡 本文使用了模糊控制算法和PID控制算法来实现系统的控制 并通过Matlab进行仿真和实验验证 文章目录 1
  • Linux--编译链接(过程、原理、执行、多个文件)

    1 编译链接四个步骤 1 预编译 gcc E main c o main i 2 编译 gcc S main i o main s 3 汇编 gcc c main s o main o 4 链接 gcc main o o main 执行 m
  • 报错:RuntimeError: CUDA error: no kernel image is available for execution on the device

    报错 RuntimeError CUDA error no kernel image is available for execution on the device 提醒 安装pytorch时 除了要注意pytorch与torchvisi
  • vue 父子 子父 传值

    文档 Vue js 渐进式 JavaScript 框架 Vue js vuejs org 父给子传值 父组件
  • 【计算机基础】面试常问之进程、线程和协程

    文章目录 背景 为什么会有进程 线程和协程 1 进程的出现 2 线程的出现 3 协程的出现 1 进程 Process 1 1 什么是进程 程序与进程的区别 特点 1 2 进程通信及使用场景 无名管道 pipe 命名管道 FIFO 消息队列
  • 什么是区块链?为什么需要区块链?

    从个故事开始吧 第一章 信任 账本时代的故事 小王问你借100W 答应一年后还你200W 你心动了 可是又怕他不还 于是乎你找到了你们村长做鉴证人 你打了一个借条 上面写着 2018年 月小王借小胡100W 答应2019年 月还小胡200W
  • 服务器系统初始化时间长,企业级-Shell案例1——服务器系统配置初始化

    bin bash 安装系统性能分析工具及其他 yum install gcc make autoconf vim sysstat net tools iostat iftop iotp wget lrzsz lsof unzip opens
  • BUUCTF【Web】LoveSQL

    进入靶场后感觉这个SQL很熟悉 跟之前的第一关easySQL相似 但是这关显然要更难一点 还是用之前的方法 用1 试试发现有回显 所以这一关还是单引号闭合 首先使用万能用户名 密码随便输入 1 or 1 1 得到提示 此时发现他的用户名是a
  • Jetpack学习之Lifecycle

    Jetpack是Google为了解决Android架构问题而引入的 Google官方说的说法 Jetpack是一套库 工具和指南 可以帮助开发者更轻松地编写应用程序 Jetpack中的组件可以帮助开发者遵循最佳做法 摆脱编写样板代码的工作并
  • DVWA不能修改等级问题解决

    在DVWA平台上进行测试时 会出现等级改了 但是有的模块是impossible的情况 我是这样解决的 1 先清空浏览器的缓存 这里可以清空最近的 就是打开DVWA之后的清空就可以了e g 最近一小时 2 退出DVWA 重新登录 3 换了浏览
  • CMakeList实战

    1 FIND PACKAGE FIND PACKAGE