[unix]用cmake写hello world

cmake判断端操作系统类型,C/C++语言判断操作系统类型 在cmake或者C++代码中判断操作系统类型 阅读详情

cmake

cmake:开源库跨平台编译,测试,打包工具。主要是通过使用平台独立配置文件来产生配置文件以及生成基于平台的makefile来控制软件的编译过程。
cmake可以:
1. 能够自动寻找软件所需要的程序,库文件,头文件等。这些文件可能因为平台的不同而不同。
2. 能够独立于源代码文件夹,在其他地方生成build文件。
3. 能够生成复杂,可控的版本文件。
4. 有选择的控制编译所需要的文件。
5. 方便的在共享库和静态库间切换。
6. 依据平台生成makefile。

基础的cmake用法以及语法

要使用cmake非常简单,只要新建若干个CMakeLists文件就能控制编译过程。CMakeLists文件需要包含对于如何构建该项目的描述。这些语句成为一系列的指令(command),有着如下的形式:

command (args...)
command是指令的名称,而args则是由白字符分割的一串参数。cmake是大小写不敏感的。

cmake 支持简单变量,变量可以通过使用像${VAR} 的语法来引用。当然也可以为一个变量设置多个参数成为一个参数组,比如
set(Foo a b c)
就将Foo这个变量设置为a b c,这样就能将命令写成如下形式:
command("${Foo}") 等同于 command("a b c")。
系统变量可以通过这种形式访问到。

Hello World cmake 0.1版

#include <stdio.h>


int main(int argc, char **argv)
{
    printf("hello world!\n");
    return 0;
}

要生成生成这么简单的一个可执行文件只需要在CMakeLists.txt中加上两句

project(hello)
add_executable(hello hello.c)

然后在当前目录下

$ cmake .
$ make
$ ./hello

即可看到效果了。

project命令指明了工作空间以及随后add_executable命令将可执行目标添加进构建过程。

Hello World cmake 0.2版

这一版本中,我们将hello world程序打散,拆成多个文件。
hello.c

#include <stdio.h>

int main(int argc, char** argv)
{
    say_hello();
    return 0;
}

func.c

void say_hello()
{
    printf("hello world!\n");
}

这一次我们发现say_hello函数将打印出hello world,而该函数则在独立的func.c文件中存在
这次我们CMakeLists.txt中变成了这样

project(hello)
add_executable(hello hello.c func.c)

Hello World cmake 0.3版

在本版的基础上,我们将加入跨平台支持。
hello.c

#include <stdio.h>


int main(int argc, char **argv)
{
    hello_all();
    say_hello();
    return 0;
}

hello_all为全平台支持函数,而say_hello依据平台不同而有不同表现。
func_all.c 全平台支持实现

void hello_all(){
    printf("hello world,my friends.\n");
}

func_app.c/func_uni.c/func_win.c

void say_hello(){
    printf("hello world,apple\n");
    //printf("hello world,linux\n"); uni.c
    //printf("hello world,windows\n"); win.c
}

最后我们的CMakeLists.txt文件则需要一点点的逻辑判断,判断哪些是文件是需要被编译进执行程序的。

cmake_minimum_required(VERSION 3.0)
project(hello)
set(HELLO_SRCS hello.c func_all.c)
if(WIN32)
    set(HELLO_SRCS ${HELLO_SRCS} func_win.c)
elseif(APPLE)
    set(HELLO_SRCS ${HELLO_SRCS} func_app.c)
elseif(UNIX)
    set(HELLO_SRCS ${HELLO_SRCS} func_uni.c)
endif()

add_executable(hello ${HELLO_SRCS})

cmake语法

CMakeLists由注释,命令以及白字符租车个。
注释由#前缀直到该行结束为止。
命令则由命令名称,括号(),白字符,分割参数等构成。所有白字符都被忽略,除了那些用来分隔参数的。\可以用来放置某些字符被当作通常意义上的解析它们。
基本命令:

project

语法:project(projectname [CXX] [C [Java] [NONE])
解释:如果没有选择语言,则项目默认解释为C/C++的。如果为NONE则不支持任何语言。同时若是制定了CXX也就同时指定了C与语言。
对于任何出现在项目中的project命令,cmake将会创建顶级的IDE项目文件,
项目奖包涵出现在其中的所有Target,以及任何通过add_subdirectory载入的子目录。如果add_subdirectory命令使用了EXCLUDE_FROM_ALL选项,那么生成的子项目不会出现在顶级的Makefile文件,这点特性十分有用,当你生成对于项目主体无关乎重要的子项目。

流控制

像其他语言一样,cmake也提供了流控制结构来帮助你解决项目构建问题。
cmake提供了如下的三种流控制结构:
1. 条件判断(e.g if)
2. 循环(e.g foreach and while)
3. 过程定义(e.g macro and function)

if

如同其他语言中的if一样,cmake中的if具有相同的意义和用法。
语法:

if(FOO)
    #do something here
else(FOO)
    #do something else
endif(FOO)

事实上以上的FOO变量条件是可以不写的,所以就有了以下形式的:

if(FOO)
    #do something here
else()
    #do something else
endif()

但是当你写上了变量条件的时候就提供了额外的机会进行差错检查。
比如如下的写法就是错误的:

set(FOO 1)

if(${FOO})
    #do something
endif(1)
    #ERROR

就像其他语言一样,cmake也支持elseif语法
语法:

if(MSVC80)
    #do something here
elseif(MSVC90)
    #do something else
elseif(APPLE)
    #do something else
endif()

但是if指令同时也存在缺陷,即它不支持c语言形式的表达式,例如${FOO} && ${BAR} || ${FUBAR}。
这里就要将以下if最基本语法:
if(variable): 当变量的值非空时候为True,e.g 0,FALSE,OFF,or NOTFOUND 就为False
if(NOT variable):当变量的值为空时候为True
if(variable1 AND variable2): 当都为True时整个表达式才为True
if(variable1 OR variable2): 当有一个为True时,才为True
if(COMMAND command-name):当提供的comman-name 可以执行的时候才会是True
if(DEFINED variable):只要定义过该变量就为True,无关乎设置了什么值
if(EXISTS file-name)/if(EXISTS directory-name):当文件或者是目录存在时为True
if(IS_DIRECTORY directory-name)/if(IS_ABSOLUTE name):当提供的name 为目录名或者是文件名时为True,绝对路径有效。
if(name1 IS_NEWER_THAN name2):当文件name1 比 文件name2 修改时间新的时候为True
if(variablle MATCHES regex)/if(string MATCHES regex):当匹配相应的表达式的时候为True
另外提供的选项如:
EQUAL,LESS,GREATER可以用来进行数值比较
STRLESS,STREQUAL,STRGREATER 可以用来进行文本比较
VERSION_LESS,VERSION_EQUAL,VERSION_GREATER可以用来比较major[.minor[.patch[.tweak]]]形式的版本信息.

对于以上出现的运算符都存在着运算优先级:
1. 对于括号()所包裹住的表达式具有最高优先级
2. 然后才是EXIST,COMMAND,DEFINED以及类似的前缀运算符
3. 之后是EQUAL,LESS,GREATER,STREQUAL,STRLESS,STRGREATER,MATCHES运算符
4. 其次是NOT运算符
5. 最后才是AND,OR
cmake 认为以下值为真值:ON,1,YES,TRUE,Y,以下值则为假值:OFF,0,NO,FALSE,N,NOTFOUND,*-NOTFOUND,IGNORE.这些值对于大小写不敏感。

foreach

语法:

foreach(tfile TESTCASE1 TESTCASE2 TESTCASE3 TESTCASE4 TESTCASE5)
    #do something
    #可以用${tfile}来访问每一次迭代过程中的变量
endforeach(tfile)

while

语法:

while(condtion expression)
    #do something
endwhile()

function

语法:

function(function_name arg0 arg1 ...)
    #do something
    #可以通过arg0,arg1..来访问函数参数
endfunction()

#调用
function_name(arg0 arg1 ..)

这里需要注意的是,参数是有作用于的,比如在父作用域中,调用某个子过程,则该子过程不会获得父作用域中的变量,只可以通过参数传递。同时对于子过程中对于变量值的改变不会直接的发生在父作用域。除非通过域声明,比如:

function(DeterminTime _time)
    # pass the result up to whatever invoked this
    set(${_time} "1:23:45" PARENT_SCOPE)
endfunction()

DeterminTime(current_time)

if(DEFINED current_time)
    message("now is ${current_time}")
endif()

macro

语法:

macro(macro_name arg0 arg1)
    #do something
    #just like function
endmacro(macro_name)

#调用
macro_name(arg0 arg1)

macro与function定义过程类似,但是与之不同的是macro不会像function那样改变作用域,即macro调用与父作用域是处于同一作用域的,即类似域c语言中的macro定义一样。

正则表达式

表达式的语法基本类似于其他语言:
^:以什么开头的字符串
$:以什么结尾的字符串
.:只匹配一个字符
[]:匹配任何在括号内的字符
[^]:匹配人和不在括号内的字符
[-]:匹配人任何在括号内范围的字符
*:匹配任何该符号前面的模式0 or 多次
+:匹配任何该符号前面的模式至少一次
?:匹配任何该符号前面的模式至多一次
():保存该组内匹配的表达式值,以便在之后使用
(|):匹配左边或者右边的表达式
以上基本语法看个人发挥,可随意组合

检查cmake的版本

由于cmake 版本更新,所以会有某些新的指令,对于老版本的cmake不兼容问题。所以可以有如下几种解决方式:
1. 对于单独的某个命令 可以测试是否可以使用

# test if the command exists

if(COMMAND some_new_command)
    #use command
    some_new_command(ARGS...)
endif()
  1. 通过比较cmake的版本信息来确定
# look for newer version of cmake
#if(${CMAKE_VERSION} VERSION_GREATER 3.0)
    #do something
endif()
  1. 当然也可以在CMakeLists.txt的起始来指定cmake的最低版本
cmake_minimum_required(VERSION 3.0)

...

模块(Module)的使用

代码重用技术可以提高软件的生产效率,同时cmake 也对代码重用技术提供了支持。
cmake 安装包内置 某些共享库,静态库的配置文件,这些配置在/usr/share/cmake/Modules文件夹内,极少数安装的软件也会将配置文件放在/usr/local/share/xxx/xxxConfig.cmake。
/usr/local/share/cmake目录下的文件类似于:

...
FindosgSim.cmake
FindosgTerrain.cmake
FindosgText.cmake
FindosgUtil.cmake
...

这些配置文件以.cmake结尾。这些.cmake文件只是指令的集合,就比如FindQt.cmake:

...
file(GLOB GLOB_TEMP_VAR /usr/lib*/qt-3*/bin/qmake /usr/lib*/qt3*/bin/qmake)
if(GLOB_TEMP_VAR)
  set(QT3_INSTALLED TRUE)
endif()
set(GLOB_TEMP_VAR)

file(GLOB GLOB_TEMP_VAR /usr/local/qt-x11-commercial-3*/bin/qmake)
if(GLOB_TEMP_VAR)
  set(QT3_INSTALLED TRUE)
endif()
set(GLOB_TEMP_VAR)
...

就比如说我像编译的时候加入Qt的库文件,那么CMakeLists.txt文件可以这么写:

include(FindQt)

target_link_libraries(Foo ${Qt_LIBRARY})

cmake将会在CMAKE_MODULE_PATH变量指定的目录中寻找cmake文件,如果找不到则会在cmake安装目录的Modules子目录中寻找。

Modules大致可以分为一下几种类别:
1. Find Modules:这些模块决定了软件元素,比如说头文件和库文件位置。
2. System Introspection Modules:系统自省模块,主要是测试系统所支持的float长度等一些系统限制
3. Utility Modules:工具模块,提供了对某些情况的支持

Find Modules

cmake提供了一些Find Modules,这些模块指定了头文件以及库文件的位置,如果找不到这些模块,那么可以用户为这些属性设置缓存条目。
就拿FindPNG.cmake来举例子吧:

# FindPNG
#
# Find libpng, the official reference library for the PNG image format.
#
# This module will set the following variables in your project:
#
# ``PNG_INCLUDE_DIRS``
#   where to find png.h, etc.
# ``PNG_LIBRARIES``
#   the libraries to link against to use PNG.
# ``PNG_DEFINITIONS``
#   You should add_definitons(${PNG_DEFINITIONS}) before compiling code
#   that includes png library files.
# ``PNG_FOUND``
#   If false, do not try to use PNG.
# ``PNG_VERSION_STRING``
#   the version of the PNG library found (since CMake 2.8.8)
#
# The following variables may also be set, for backwards compatibility:
#
# ``PNG_LIBRARY``
#   where to find the PNG library.
# ``PNG_INCLUDE_DIR``
#   where to find the PNG headers (same as PNG_INCLUDE_DIRS)
#
# Since PNG depends on the ZLib compression library, none of the above
# will be defined unless ZLib can be found.

if(ZLIB_FOUND)
  find_path(PNG_PNG_INCLUDE_DIR png.h
  /usr/local/include/libpng             # OpenBSD
  )

  list(APPEND PNG_NAMES png libpng)

  if(NOT PNG_LIBRARY)
    find_library(PNG_LIBRARY_RELEASE NAMES ${PNG_NAMES})
    find_library(PNG_LIBRARY_DEBUG NAMES ${PNG_NAMES_DEBUG})
    include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
    select_library_configurations(PNG)
    mark_as_advanced(PNG_LIBRARY_RELEASE PNG_LIBRARY_DEBUG)
  endif()
  unset(PNG_NAMES)

  # Set by select_library_configurations(), but we want the one from
  # find_package_handle_standard_args() below.
  unset(PNG_FOUND)

  if (PNG_LIBRARY AND PNG_PNG_INCLUDE_DIR)
      # png.h includes zlib.h. Sigh.
      set(PNG_INCLUDE_DIRS ${PNG_PNG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} )
      set(PNG_INCLUDE_DIR ${PNG_INCLUDE_DIRS} ) # for backward compatiblity
      set(PNG_LIBRARIES ${PNG_LIBRARY} ${ZLIB_LIBRARY})

      if (CYGWIN)
        if(BUILD_SHARED_LIBS)
           # No need to define PNG_USE_DLL here, because it's default for Cygwin.
        else()
          set (PNG_DEFINITIONS -DPNG_STATIC)
        endif()
      endif ()
  ...

这里我只是摘取了部分的FindPNG.cmake内容,从前面的注释部分可以看到该部分声明了该.cmake文件定义了一些可以在CMakeLists.txt中可以使用的变量,e.g:PNG_LIBRARIES,PNG_INCLUDE_DIRS。后面的主体部分则是如何定义这些变量。

find_path命令用来确定PNG的include 文件,第一个参数是找到的路径保存在哪个变量中,第二个参数是要找到的头文件名,第三个参数是需要查找的路径。
find_library 命令用来确定PNG的lib库文件
之后就是设置之某些变量的过程了。

System Introspection Modules

这类模块通常以Test 或者Check为前缀,比如TestBigEndian,CheckTypeSize

库链接

通用的链接方式

target_link_libraries(myexe /path/to/libfoo.a)
myexe是需要链接的目标名,/path/to/libfoo.a是库文件地址
多个库需要链接进目标:
target_link_libraries(myexe /path/to/libA.so /path/to/libB.so)

链接系统库

在unix-like系统中也会提供某些lib库文件,这些文件放在/usr/lib or /lib文件夹中,这些文件夹被认为是默认搜索目录。
比如一下代码:

find_library(M_LIB m)
target_link_libraries(myexe ${M_LIB})

find_library(M_LIB m)将会找到/usr/lib/libm.so

C++入门:从Hello World到开发环境配置 C++作为经典的编译型语言,其学习路径往往从最简单的"Hello World"程序开始。这个入门示例虽然简单,却完整展现了编程的核心概念:从源码编写、编译器工作原理到程序执行流程。理解这些基础原理对掌握C++开发至关重要,特别是编译器的选择与配置(如GCC/G++、Clang等主流工具链)、开发环境搭建等工程实践环节。现代IDE虽然简化了配置过程,但深入理解底层机制能帮助开发者避免成为"配置工程师"。本文以Windows平台为例,详细介绍MinGW编译器的安装配置、VS Code环境搭建,以及如何通过这个经 阅读详情

相关推荐

Mac上CMake安装与配置全攻略:从下载到Hello World

本文提供了在Mac系统上安装和配置CMake的完整指南,涵盖图形化与Homebrew命令行两种安装方法。详细解释了CMake的核心概念,并通过一个Hello World项目演示了如何编写CMakeLists.txt文件、分离源码与构建目录,以及执行构建流程,帮助Mac开发者快速掌握这一自动化构建工具,提升C/C++项目管理效率。

weixin_27791839的博客 406

Linux与Windows下CMake的安装与编译

CMake是一个允许开发者编写一种平台无关的 CMakeList.txt 文件,来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。 一、Linux下安装 在linux环境下打开网页浏览器,输入网址:https://cmake.org/download/,找到最新版本的位置。 使用源码安装 ta

sinat_31608641的博客 3974

CMake实战:从Hello World到跨平台项目构建(附完整代码示例)

本文详细介绍了CMake从基础Hello World到跨平台项目构建的实战指南,包含完整代码示例。通过CMake入门教程,开发者可以学习如何配置多平台项目、处理平台差异、集成第三方库以及优化构建性能,显著提升开发效率。

weixin_28839699的博客 126

Unix运维_CMake教程_CMake中的link_libraries指令

Unix运维 CMake教程 CMake中的link_libraries指令。

goufeng93的博客 1567

【C语言学习疑难杂症】第20期:0x00007FF7F2821964处引发的异常0xC0000005写入位置 0x0000000000000

检查代码中是否存在野指针访问的情况,确保在进行写入操作之前,内存已经被正确分配或初始化,并且在使用完毕后进行了正确的释放。空指针访问:代码尝试在空指针地址(0x0000000000000000)处进行写入操作,导致访问冲突。检查代码中是否存在数组越界的情况,确保在进行写入操作之前,数组的索引值在合法范围内。检查代码中是否存在空指针访问的情况,确保在进行写入操作之前,指针已经被正确初始化。野指针访问:代码尝试在已释放或未初始化的内存地址进行写入操作,导致访问冲突。

学无止境 828

高通SDX35平台 modem启动异常分析

SDX35 MIFI项目在生产时出现modem反复重启问题。经排查发现是modem在初始化GNSS模块时访问了不存在的硬件地址导致崩溃,原因是产线使用的SDX35 000-AB型号芯片阉割了GNSS功能,而本地测试使用的AA型号支持该功能。解决方案是通过修改modem编译选项,采用高通新提供的genlmm2选项(保留IMS和SMS功能但去除GNSS支持),最终解决了启动异常问题并满足VZW认证需求。

四儿家的小祖宗的博客 273

CMakeLists.txt语法简介(验证通过)

文章目录一、Cmake 简介二、常用命令1. 指定 cmake 的最小版本2.设置项目名称3.设置编译类型4. 指定编译包含的源文件5.查找指定的库文件6.设置包含的目录7.设置链接库搜索目录8. 设置 target 需要链接的库9. 设置变量10.条件控制三、常用变量四、cv项目cmakelists五、参考 一、Cmake 简介 cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。 二、常用命令 1. 指定 cm

孤狼北望 878

银行一表通监管报送系统详解

国家金融监管总局对于“一表通”的总体描述为:通过建立一套明细级、标准化的数据体系和汇总计算规则,将银行机构传送至监管可信区的业务明细数据汇总生成财务指标、监管指标和监管报表,大幅提升监管数据时效性,统一数据标准,实现数据间的穿透和整合,同时改变机构多头报送数据模式,减轻机构报送负担。

银行信息系统应用架构详解 2516

使用Cmake编译项目从入门到精通

cmake 的特点主要有: 1,开放源代码,使⽤类BSD 许可发布。http://cmake.org/HTML/Copyright.html 2,跨平台,并可⽣成native 编译配置⽂件,在Linux/Unix 平台,⽣成 makefile,在苹果平台,可以⽣ 成xcode,在 Windows 平台,可以⽣成 MSVC ...

cnzzs的博客 1063

如何修改网页中的文本内容改成自己希望的数值?

本篇文章主要讲解,通过浏览器命令和浏览器自带的F12开发者工具,进行修改网页内容的方法教程 日期:2021年12月5日 作者:任聪聪 一、通过F12开发者工具进行修改 进入方式汇总: 1.右击鼠标,显示菜单找到审查 2.通过快捷键F12进入,笔记本需要先关闭fnlk功能键。 开发者工具介绍 说明: 1.表示选择元素,点击后可以选择文本的元素所在地 2.表示显示方式,手机还是电脑 3.表示div元素,点击后可以展开,对div内的html和文本进行编辑。 双击文本,即可进行修改成自己想要的,但是刷新后.

任聪聪的博客 2万+

AMBA-CHI协议详解(七)

本节描述该协议包含的支持系统保序需求的机制。

Crazzy_M的博客 1158

ESP32 快速入门(四): CMake 以及分解 esp-idf 中的 hello_world 工程结构

一. CMake 简介 CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的 makefile 或者 project 文件,能测试编译器所支持的 C++ 特性,类似 UNIX 下的 automake。 二. CMake 示例及语法 以下是我选取的 CMake 代码示例: [cpp] view plain copy #project na...

weixin_43583605的博客 3314

C# NX二次开发-查找连续倒圆角面

可以通过ufun函数 UF_MODL_ask_face_type 和 UF_MODL_ask_face_props 可判断处理选择相应的一组圆角面。在QQ群里有人问怎么通过一个选择一个倒圆角面来自动选中一组倒圆角面。这个是初步思路,如果有更好的思路可回复讨论一下。

fhqiwmc的博客 617

CMake命令篇--1、简单基本代码运行(hello world)

一个写好的代码运行需要通过配置文件进行编译链接形成可执行程序,这些工作开始由我们自己手动配置,但当项目工程数量增加时,手写就显得不方便,而且兼容性很差CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

lhxcc_fly的博客 492

30天入门 SAP BTP 开发系列之七:动手在 SAP BTP 上开发第一个 ABAP 程序

本教程从理论转向实践,指导如何在SAP BTP上创建首个ABAP程序。首先通过Booster向导在Trial账号中配置ABAP环境,需确保已启用Cloud Foundry并创建Space。成功创建ABAP实例后,使用ABAP Development Tool连接环境:下载服务密钥文件,导入工具获取连接URL,即可建立项目开始编码。教程提供了从环境搭建到开发工具配置的完整流程,帮助ABAP开发者快速上手BTP云开发。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1673

【TCAD】Sentaurus 中的“陷阱trap”仿真设置

允许使用有限的数据集名称 SFactor 规范,例如 DeepLevels , xMoleFraction , 和 yMoleFraction (从兴奋剂档案中读取) eTrappedCharge 和 hTrappedCharge (从指定的文件中读取 DevFields 在 File 部分)或 PMI 用户字段 PMIUserField0...10 (从指定的文件中读取 PMIUserFields 在 File 部分)。给定的陷阱截面 eNeutral 陷阱是多种多样的 Xsec 项目参数。

荷塘阅色 1307

CMake跨平台构建:从Hello World到大型项目

CMake的核心优势在于声明式构建简单项目:单文件直接编译中型项目:模块化大型项目:结合管理依赖最佳实践:始终在build目录编译(隔离源码),使用跨平台编译,并通过CTest集成测试。

sjsgxxxsjsdg的博客 375

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

CMake新手必看:从Hello World到跨平台构建的5个关键步骤

本文是CMake新手教程,详细介绍了从Hello World项目到跨平台构建的5个关键步骤。内容涵盖环境配置、基础项目搭建、核心概念解析、跨平台策略和现代最佳实践,帮助开发者快速掌握CMake构建工具的使用技巧,提升C/C++项目的开发效率。

x8y9z0的博客 871

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

CMake简单使用

什么是CMake? 大家都知道makefile就是用来管理代码自动化编译的工具,而cmake就是makefile的上层工具,目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量。cmake能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake. 1.首先我们来编写一个“Hello Wor...

qq_43575154的博客 441

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

CMAKE & AUTOTOOLS

cmake的主要特点: 1.开放源代码,使用类BSD许可发布。 2.跨平台,并可生成native编译配置文件,在linux/Unix平台,生成makefile,在苹果平台,可以生成xcode,在Windows平台,可以生成MSVC的工程文件。 3.能够管理大型项目。 4.简化编译构建过程和编译过程。cmake的工具链非常简单:cmake+make 5.高效率,可扩展。 Install cmake ...

PI_sunyang的博客 1475

001 - CMake 安装

CMake 安装 文章目录CMake 安装CMake 是什么为什么使用 CMakeCMake安装下载二进制压缩包安装源码安装验证安装是否成功实例CMake 版 Hello World CMake 是什么 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。 Cmake 并不直接建构

EricTeo 3417

【cmake】Cmake实践一:hello world(v1.0)

1.Cmake简介CMake是一个跨平台的建构系统的工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的构建文档makefile或者project文件,描述系统建构的过程。还能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。CMake并不直接建构出最终的软件,而是产生标准的建构档(如 Unix的

Felaim的博客 1756

cmake学习笔记

cmake教程

wenxingxingxing的博客 643

【学习cmake】CMake初步使用教程

参考 https://jingyan.baidu.com/article/a378c960c20c06b329283047.html CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为

开源节流 4040

cmake的相关知识

弱弱的用"cmake .."装了很多软件,还不知道为什么要这样,找到个蛮好的资料,转载下,转自此处。 ———————————————————————————————————————————————————— 作者:孙晓明,华清远见嵌入式学院讲师。 前言: cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品。后来经过发展,最

Ritter Liu的专栏 1384
上一篇: [Servlet]JSP和Servlet的关系,以及JSP语法
下一篇: [UT]Markdown语法(github版)
HeapStackk
博客等级 码龄12年 11粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值