Windows Powershell+CMAKE+MinGW

Windows: Powershell+CMAKE+MinGW

  1. Powershell是命令行控制工具
  2. Make和CMake是构建工具
  3. MSVC是指微软的VC编译器。 MinGW是指是Minimalist GNU on Windows的缩写,MinGw是windows版本的gcc集合,MinGW 还包含有一些其他的 GNU 程序开发工具

Powershell

powershell是cmd的超集

PowerShell

常用命令

tree显示目录文件夹
tree /f显示目录文件夹及文件结构
get-childitem显示当前目录下的文件
Start-Process powershell -Verb runAs打开管理员模式窗口

删除文件




CMake介绍与安装

CMake

官网 下载

规范:大小写不敏感,约定俗成用大写

常用命令

构建MinGW文件:cmake -G "MinGW Makefiles"

构建MSVC文件:cmake -G "MinGW Makefiles"

外部构建:cmake -G -B ./build

构建文件+外部构建+安装路径 一起写:cmake -B ./build -G "MinGW Makefiles" -D CMAKE_INSTALL_PREFIX=/test

编译:mingw32-make

修改安装路径:cmake -D CMAKE_INSTALL_PREFIX=/test

编译并安装:mingw32-make install

CMake教程

样例流程

构建

准备:写一个cpp文件,和一个CMakeLists.txt

#main.cpp
#include <iostream>
int main(){
	std::cout << "hello word" << std::endl;
}
PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir" ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir" ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

Powershell输入:cmake .

在windows下直接使用cmake. 生成的是支持Visual Studio的MSVC的sln项目文件

cmake -G "MinGW Makefiles" #构建支持MinGW的文件
cmake -G "NMake Makefiles" #构建支持Visual Studio的MSVC的文件
# 在windows系统下,使用 cmake . 默认生成的是VS的sln项目文件

构建支持Visual Studio的MSVC的文件:cmake -G "NMake Makefiles" 或者 windows下直接使用 cmake .

PS C:\Users\Zhang> cd D:\code_projects\OddJobs\CMAKE_LEARN\Test21\
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21> cmake .
-- Building for: Visual Studio 16 2019
-- The C compiler identification is MSVC 19.29.30147.0
-- The CXX compiler identification is MSVC 19.29.30147.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/software/code/VS2019/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/software/code/VS2019/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- This is BINARY dirD:/code_projects/OddJobs/CMAKE_LEARN/Test21
-- This is SOURCE dirD:/code_projects/OddJobs/CMAKE_LEARN/Test21
-- Configuring done
-- Generating done
-- Build files have been written to: D:/code_projects/OddJobs/CMAKE_LEARN/Test21
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21>

构建支持MinGW的文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4mTcx3fr-1687752064842)(Windows%20Powershell+CMAKE+MinGW%2008edcd49fc894b03bfcf07b2c3b3ff50/Untitled.png)]

PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21> cmake -G “MinGW Makefiles”
CMake Warning:
  No source or binary directory provided.  Both will be assumed to be the
  same as the current working directory, but note that this warning will
  become a fatal error in future CMake releases.

-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/library/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/library/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- This is BINARY dirD:/code_projects/OddJobs/CMAKE_LEARN/Test21
-- This is SOURCE dirD:/code_projects/OddJobs/CMAKE_LEARN/Test21
-- Configuring done
-- Generating done
-- Build files have been written to: D:/code_projects/OddJobs/CMAKE_LEARN/Test21
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EOBFIz3K-1687752064842)(Windows%20Powershell+CMAKE+MinGW%2008edcd49fc894b03bfcf07b2c3b3ff50/Untitled%201.png)]

编译

windows系统下可使用Mingw编译,命令是: mingw32-make

编译完毕后会生成相应的exe文件或lib、dll文件。

PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21> mingw32-make
[ 50%] Building CXX object CMakeFiles/hello.dir/main.cpp.obj
[100%] Linking CXX executable hello.exe
[100%] Built target hello
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21> hello

测试

输入./hello,即可执行hello.exe文件,打印“hello world”

PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21> ./hello
hello world
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21>

关键字

PROJECT关键字

可以用来指定工程的名字和支持的语言,默认支持所有语言

PROJECT(HELLO) 指定了工程的名字,并且支持所有语言一建议

PROJECT(HELLO CXX) 指定了工程的名字,并且支持语言是C++

PROJECT(HELLO C CXX) 指定了工程的名字,并且支持语言是C和C++

该指定隐式定义了两个CMAKE的变量

_BINARY_DIR,本例中是 HELLO_BINARY_DIR

_SOURCE_DIR,本例中是 HELLO_SOURCE_DIR

MESSAGE关键字就可以直接使用这两个变量,当前都指向当前的工作目录,后面会讲外部编译

问题:如果改了工程名,这两个变量名也会改变

解决:又定义两个预定义变量:PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR,这两个变量和HELLO_BINARY_DIR,HELLO_SOURCE_DIR是一致的,所以改了工程名也没有关系。


SET关键字

用于定义变量。

例如:SET(SRC_LIST main.cpp) ,其中SRC_LIST变量就包含了main.cpp

也可以 SET(SRC_LIST main.cpp t1.cpp t2.cpp)


MESSAGE关键字

向终端输出用户自定义的信息

主要包含三种信息:

  • SEND_ERROR,产生错误,生成过程被跳过
  • STATUS,输出前缀为- -的信息
  • FATAL_ERROR,立刻终止所有CMAKE的过程

ADD_EXECUTABLE关键字

生成可执行文件

ADD_EXECUTABLE(hello ${SRC_LIST}) @生成的可执行文件名是hello,源文件读取变量SRC_LIST中的内容也可以直接写 ADD_EXECUTABLE(hello main.cpp)

上述例子可以简化的写成

PROJECT(HELLO)

ADD EXECUTABLE(hello main.cpp)

注意: 工程名的 HELLO 和生成的可执行文件 hello 是没有任何关系的

语法

  • 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名了
  • 指令(参数1 参数 2…) 参数使用括狐括起,参之间使用空格或分号分开。以上面的 ADD_EXECUTABLE 指令为例,如果存在另外一个 func.cpp源文件,就要写成: ADD_EXECUTABLE(hello main.cpp func.cpp)或者ADD_EXECUTABLE(hello main.cpp;func.cpp)
  • 指令是大小写无关的,参数和变量是大小写相关的。但推荐你全部使用大写指令

语法注意事项

  • SET(SRC_LIST main.cpp)可以写成SET(SRC_LIST "main.cpp"),如果源文件名中含有空格,就必须要加双引号
  • ADD_EXECUTABLE(hello main)后缀可以不加,他会自动去找.c和.cpp,最好不要这样写,可能会有这两个文件main.cpp和main

外部构建

  • 内部构建,上述例子就是内部构建,他生产的临时文件特别多,不方便清理
  • 外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响;强烈使用外部构建方式

外部构建方式举例

在windows的powershell里面是需要使用 cmake -B ./build 命令即可,build文件夹会自己创建。

cmake -G "MinGW Makefiles"-B ./build 或者 cmake -B ./build -G "MinGW Makefiles"

注意外部构建的工程和编译路径:HELLO_SOURCE_DIR工程路径仍然是当前文件夹;HELLO_BINARY_DIR编译路径,转为bulid文件夹下了。

PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21> cmake -G “MinGW Makefiles”-B ./build
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/library/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/library/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- This is BINARY dirD:/code_projects/OddJobs/CMAKE_LEARN/Test21/build
-- This is SOURCE dirD:/code_projects/OddJobs/CMAKE_LEARN/Test21
-- Configuring done
-- Generating done
-- Build files have been written to: D:/code_projects/OddJobs/CMAKE_LEARN/Test21/build
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21> cd build
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21\build> mingw32-make
[ 50%] Building CXX object CMakeFiles/hello.dir/main.cpp.obj
[100%] Linking CXX executable hello.exe
[100%] Built target hello
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test21\build>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yoYZYz4M-1687752064843)(Windows%20Powershell+CMAKE+MinGW%2008edcd49fc894b03bfcf07b2c3b3ff50/Untitled%202.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1nQmMvyT-1687752064843)(Windows%20Powershell+CMAKE+MinGW%2008edcd49fc894b03bfcf07b2c3b3ff50/Untitled%203.png)]

文件架构

  • 添加子目录 src,放置工程源代码,比如.cpp文件
  • 添加子目录 doc,放置工程文档,比如hello.txt
  • 添加文本文件 COPYRIGHT, README
  • 添加一个 runhello.sh 脚本,用来调用 hello 二进制
  • 添加bin子目录,并将构建后的目标文件放入构建目录的 bin 子目录
  • 将 doc 目录 的内容以及 COPYRIGHT/README 安装到指定文件夹下

目录

每个目录下都要有一个CMakeLists.txt说明
[root@localhost cmake]# tree
.
|--- build
|--- CMakeLists.txt
|--- src
      |--- CMakeLists.txt
      |--- main.cpp

外层CMakeLists.txt

PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)

src下的CMakeLists.txt

ADD_EXECUTABLE(hello main.cpp)

ADD_SUBDIRECTORY 指令

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

  • 这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
  • EXCLUDE_FROMALL函数是将写的目录从编译中排除,如程序中的example
  • ADD_SUBDIRECTORY(src bin) 将src子目录加入工程并指定编译输出(包含编译中间结果)路径为bin目录;如果不进行 bin 目录的指定,那么编译结果(包括中间结果)都将存放在build/src目录

更改二进制的保存路径

SET指令重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量来指定最终的目标二进制的位置。

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

问题:加载哪个CMakeLists.txt当中

答案:哪里要改变目标存放路径,就在哪里加入上述的定义,所以应该在src下的CMakeListstxt下写

安装

linux安装代码:

  • 一种是从代码编译后直接 make install 安装
  • 一种是打包时的指定目录安装。
    • 简单的可以这样指定目录:make install DESTDIR=/tmp/test(linux下)
    • 稍微复杂一点可以这样指定目录:./configure –prefix=/usr(linux下)

mingw编译并安装的代码mingw32-make install

默认路径:C:/Program Files (x86)/,但是如果直接用,会提示无法创建文件夹,应该是没有管理员权限;

修改安装路径使用命令:cmake -D CMAKE_INSTALL_PREFIX=/test,注意该命令不仅仅修改安装路径,而是同时构建。修改完之后,安装路径指向D:/test下的,可以正常安装。


样例

使用CMAKE一个新的指令:INSTALL

INSTALL的安装可以包括:二进制、动态库、静态库以及文件、目录、脚本等

// 目录树结构
[root@localhost cmake] # tree
.
|--build
|--CMakeLists.txt
|--COPYRIGHT
|--doc
|  |--hello.txt
|--README
|--runhello.sh
|--src
		|--CMakeLists.txt
		|--main.cpp

3 directions, 7 files

安装文件COPYRIGHT和README

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/)
FILES: 文件
DESTINATION:

  1. 写绝对路径
  2. 可以写相对路径,相对路径的实际路径是${CMAKE_INSTALL_PREFIX}/<DESTINATION 定义的路径>。CMAKE_INSTALL_PREFIX 默认是在/usr/local/(linux下)。
    可以通过cmake-D CMAKE_INSTALL_PREFIX=/usr在cmake构建的时候指定CMAKE_INSTALL_PREFIX变量的路径。

安装脚本runhello.sh

PROGRAMS: 非目标文件的可执行程序安装(比如脚本之类)

INSTALL(PROGRAMS runhello.sh DESTINATION bin) 说明:实际安装到的是/usr/bin


安装 doc 中的 hello.txt

  • 是通过在 doc 目录建立CMakeLists.txt,通过install下的file
  • 是直接在工程目录通过 INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)

DIRECTORY后面连接的是所在Source目录的相对路径:

注意:doc和doc/有很大的区别

目录名不以/结尾:这个目录将被安装到目标路径下

目录名以/结尾,将这个目录中的内容安装到目标路径

静态库和动态库的构建

任务:

  1. 建立一个静态库和动态库,提供 HelloFunc 函数供其他程序编程使用,HelloFunc 向终端输出 Hello World 字符串。
  2. 安装头文件与共享库。

静态库和动态库的区别

  • 静态库的扩展名一般为“.a”或"lib”; 动态库的扩展名一般为"so”或"dll”;
  • 静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行;
  • 动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。
# 文件树
.
|—build
|—CMakeLists.txt
|—lib
|—CMakeLists.txt
|—hello.cpp
|—hello.h
//.h头文件
#ifdef HELLO_H
#define Hello_H

void HelloFunc();

#endif
//.cpp文件
#include "hello.h"
#include <iostream>
void HelloFunc(){
	std::cout<<"Hello World"<<std::endl;
}
//项目中CMakeLists.txt中的内容
PROJECT(HELLO)
ADD_SUBDIRECTORY(lib bin)
//lib中CMakeLists.txt中的内容
SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oEGWBWEJ-1687752064843)(Windows%20Powershell+CMAKE+MinGW%2008edcd49fc894b03bfcf07b2c3b3ff50/Untitled%204.png)]

cmake构建后,使用mingw make,得到dll文件


生成库文件而不是EXE文件:ADD_LIBRARY

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

  • hello: 正常的库名,生成的名字前面会加上lib,最终产生的文件时libhello.dll或者libhello.so
  • SHARED:动态库;STATIC:静态库
  • ${LIBHELLO_SRC}: 源文件

同时构建静态库和动态库

如果同时构建同名的静态库、动态库时,只会构建前一个,写在后面的不构建。

# 如果用这种方式,只会构建一个动态库,不会构建出静态库,虽然静态库的后缀是.a
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})
# 输出
-- Build files have been written to: D:/code_projects/OddJobs/CMAKE_LEARN/Test04/build
[ 50%] Building CXX object bin/CMakeFiles/hello.dir/hello.obj
[100%] Linking CXX shared library libhello.dll # 没有构建静态库,只有动态库
[100%] Built target hello
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test04\build>
# 修改静态库的名字,可以;但是一般希望名字相同
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})

关键字:SET_TARGET_PROPERTIES

可以设置输出的名称,对于动态库,还可以指定动态库版本和API版本。

# 同时构建静态和动态库
SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})

# 对hello static的重名为hello
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
# cmake 在构建一个新的target 时,会试清理掉其他使用这个名字的库;因为,在构建 Libhello.so/Libhello.dll时,就会清理掉ibhello.a
~~SET_TARGET_PROPERTIES(hello static PROPERTIES CLEAN_DIRECT_OUTPUT 1) # 不明所以~~

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

~~SET_TARGET_PROPERTIES(hello PROPERTIES OUTPUT_NAME "hello") # 不明所以
SET_TARGET_FPOPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1) # 不明所以~~
# 修改
SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") # 改名字
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
# 输出
[ 25%] Building CXX object bin/CMakeFiles/hello_static.dir/hello.obj
[ 50%] Linking CXX static library libhello.a # 构建静态库
[ 50%] Built target hello_static
[ 75%] Building CXX object bin/CMakeFiles/hello.dir/hello.obj
[100%] Linking CXX shared library libhello.dll # 构建动态库
[100%] Built target hello

动态库的版本号

一般动态库都有一个版本号的关联

libhello.so.1.2
libhello.so -> libhello.so.1
libhello.so.1 -> libhello.so.1.2

CMakeLists.txt插入如下:SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1) 其中,VERSION指代动态库版本,SOVERSION指代API版本。


安装共享库和头文件

本例中我们将 hello 的共享库安装到/lib目录,将 hello.h 安装到/include/hello 目录

~~# 文件放到该目录下
INSTALL(FILES hello.h DESTINATION include/hello)~~
# 二进制,静态库,动态摩安装都用TARGETS
~~~~# ARCHIVE 特指静态库,LIBRARY 特指动态库,RUNTIME 特指可执行目标二进制。
~~INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)~~
SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
INSTALL(FILES hello.h DESTINATION include/hello)
INSTALL(TARGETS hello LIBRARY DESTINATION bin)
INSTALL(TARGETS hello_static ARCHIVE DESTINATION lib)# 写未改名前的文件
# 输出
Install the project...
-- Install configuration: ""
-- Up-to-date: /test/include/hello/hello.h
-- Up-to-date: /test/lib/libhello.dll.a
-- Up-to-date: /test/bin/libhello.dll
-- Installing: /test/lib/libhello.a

使用外部共享库和头文件

使用上一步安装好的头文件和库文件,该工程的文件目录如下:

[root@MiWiFi-R4CM-srv cmake3]# tree
.
├── build
├── CMakeLists.txt
└── src
    ├── CMakeLists.txt
    └── main.cpp
// main文件
#include "hello.h"

int main(){
	HelloFunc();
}

外部构建+构建支持MinGW的文件:cmake -B ./build -G “MinGW Makefiles”


头文件、库文件搜索路径

安装路径默认是在系统目录下的,但是有访问权限的问题,所以我们构建时一并改到了D盘下,cmake-D CMAKE_INSTALL_PREFIX=/test,即为D:/test。

头文件路径

  1. include <hello/hello.h> .cpp文件这样include是可以,包含D:/test/hello/hello.h。

  2. 关键字:INCLUDE_DIRECTORIES 这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割;
    在CMakeLists.txt中加入头文件搜索路径 INCLUDE_DIRECTORIES(/test/include/hello),注意前面加/是绝对路径;
    注意:添加路径要在ADD_EXECUTABLE等命令之前

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JJ4sEOVu-1687752064844)(Windows%20Powershell+CMAKE+MinGW%2008edcd49fc894b03bfcf07b2c3b3ff50/Untitled%205.png)]

    找不到头文件提示错误

共享库路径

通常报错信息为:undefined reference to `HelloFunc()’

关键字:LINK_DIRECTORIES 添加非标准的共享库搜索路径;指定第三方库所在路径,LINK_DIRECTORIES(/home/myproject/libs);注意:添加路径要在ADD_EXECUTABLE等命令之前

关键字:TARGET_LINK_LIBRARIES 添加需要链接的共享库;TARGET_LINK_LIBRARIES的时候,只需要给出动态链接库的名字就行了;注意:添加路径要在ADD_EXECUTABLE等命令之后;例如链接静态库,TARGET_LINK_LIBRARIES(main libhello.a)

# 使用静态库
INCLUDE_DIRECTORIES(/test/include/hello)
Link_DIRECTORIES(/test/lib)
ADD_EXECUTABLE (hello main.cpp)
TARGET_LINK_LIBRARIES(hello libhello.a)
# 输出
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test05\build> mingw32-make
[ 50%] Building CXX object bin/CMakeFiles/hello.dir/main.obj
[100%] Linking CXX executable hello.exe
[100%] Built target hello # 编译成功
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test05\build> ./bin/hello
Hello World # 运行成功
# 使用动态库
INCLUDE_DIRECTORIES(/test/include/hello)
Link_DIRECTORIES(/test/bin)
ADD_EXECUTABLE (hello main.cpp)
TARGET_LINK_LIBRARIES(hello libhello.dll)
# 输出
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test05\build> mingw32-make
-- Configuring done
-- Generating done
-- Build files have been written to: D:/code_projects/OddJobs/CMAKE_LEARN/Test05/build
[ 50%] Building CXX object bin/CMakeFiles/hello.dir/main.obj
[100%] Linking CXX executable hello.exe
[100%] Built target hello # 编译成功
PS D:\code_projects\OddJobs\CMAKE_LEARN\Test05\build> ./bin/hello
# 不显示Hello World # 运行失败

因为静态库在编译时会添加到可执行文件中,而动态库不会,需要搜索到才行。

将libhello.dll文件添加到hello.exe文件目录下,再执行,如下所示:

PS D:\code_projects\OddJobs\CMAKE_LEARN\Test05\build> ./bin/hello
Hello World

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aHae0a5a-1687752064844)(Windows%20Powershell+CMAKE+MinGW%2008edcd49fc894b03bfcf07b2c3b3ff50/Untitled%206.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C8jBaHdd-1687752064844)(Windows%20Powershell+CMAKE+MinGW%2008edcd49fc894b03bfcf07b2c3b3ff50/Untitled%207.png)]

~~# 查看main的链接情况~~(linux下)
~~[root@MiWiFi-R4CM-srv bin]# ldd main
	linux-vdso.so.1 =>  (0x00007ffedfda4000)
	libhello.so => /lib64/libhello.so (0x00007f41c0d8f000)
	libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f41c0874000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f41c0572000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f41c035c000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f41bff8e000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f41c0b7c000)~~

~~特殊的环境变量 CMAKE_INCLUDE_PATHCMAKE_LIBRARY_PATH~~ (linux下)

注意:这两个是环境变量而不是 cmake 变量,可以在linux的bash中进行设置

上面例子中使用了绝对路径INCLUDE_DIRECTORIES(/usr/include/hello)来指明include路径的位置,还可以使用另外一种方式,使用环境变量export CMAKE_INCLUDE_PATH=/usr/include/hello


生产debug版本的方法: cmake -D CMAKE_BUILD_TYPE=debug


Reference

  1. Billibili-从零开始详细介绍CMake

从零开始详细介绍CMake.pdf

待学习

  1. CSDN专栏-快速搭建C/C++项目
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要在PowerShell中读取文本文件,可以使用Get-Content命令。以下是一个示例: ``` Get-Content -Path "C:\path\to\file.txt" ``` 此命令将读取指定路径下的file.txt文件,并将其内容作为字符串数组返回。您可以将其存储在变量中,或使用其他命令对其进行操作。 ### 回答2: Powershell是一种在Windows操作系统上运行的脚本语言和Shell环境。它可以用于执行各种任务,包括读取和处理文本文件。 要使用Powershell读取文本文件,首先需要使用`Get-Content`命令。这个命令可以从指定的文件中读取内容,并将其存储在一个数组中,每一行都是数组的一个元素。 例如,假设我们有一个名为example.txt的文本文件,其中包含以下内容: ``` Hello, World! This is an example file. I like using Powershell. ``` 我们可以使用以下命令将该文件的内容读取到一个数组中: ``` $content = Get-Content -Path "example.txt" ``` 然后,我们可以使用循环来逐行处理读取到的文本内容: ``` Foreach ($line in $content) { # 对每一行进行处理 Write-Host $line } ``` 上面的代码中,`$line`是循环中的当前行内容,我们可以根据需要对每一行进行自定义处理,例如输出到控制台、进行字符串操作等。 除了使用`Get-Content`命令外,Powershell还提供了许多其他与文本文件读写相关的命令,例如`Set-Content`用于将文本写入文件、`Add-Content`用于在文件中追加文本等。 总之,通过使用Powershell的`Get-Content`命令,我们可以轻松地读取文本文件,并对其内容进行各种处理。 ### 回答3: Powershell是一种强大的脚本语言和命令行工具,可以用于读取和处理各种文件,包括txt文件。 要使用Powershell读取txt文件,可以使用Get-Content命令。通过在命令行中输入"Get-Content 路径\文件名.txt",Powershell会打开并读取指定的txt文件。 例如,如果要读取D盘根目录下的test.txt文件,可以输入命令"Get-Content D:\test.txt"。之后,Powershell会读取该txt文件并将其内容显示在命令行窗口中。 除了显示文件内容外,Powershell还可以对txt文件进行其他操作。例如,可以使用|(管道)符号将Get-Content命令与其他命令结合起来,实现更复杂的操作。例如,可以使用Select-String命令在txt文件中搜索特定的字符串,并将搜索结果输出到命令行窗口中。 除了使用命令行方式,也可以在Powershell脚本中使用Get-Content命令来读取txt文件。在脚本中,可以使用变量来存储Get-Content命令的输出,以便后续处理。 总之,通过使用Get-Content命令,Powershell可以方便地读取和处理txt文件。无论是通过命令行方式还是在脚本中使用,都可以轻松操作txt文件中的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值