Windows: Powershell+CMAKE+MinGW
文章目录
- Powershell是命令行控制工具
- Make和CMake是构建工具
- MSVC是指微软的VC编译器。 MinGW是指是Minimalist GNU on Windows的缩写,MinGw是windows版本的gcc集合,MinGW 还包含有一些其他的 GNU 程序开发工具
Powershell
powershell是cmd的超集
常用命令
tree | 显示目录文件夹 |
---|---|
tree /f | 显示目录文件夹及文件结构 |
get-childitem | 显示当前目录下的文件 |
Start-Process powershell -Verb runAs | 打开管理员模式窗口 |
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:
- 写绝对路径
- 可以写相对路径,相对路径的实际路径是${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/有很大的区别
目录名不以/结尾:这个目录将被安装到目标路径下
目录名以/结尾,将这个目录中的内容安装到目标路径
静态库和动态库的构建
任务:
- 建立一个静态库和动态库,提供 HelloFunc 函数供其他程序编程使用,HelloFunc 向终端输出 Hello World 字符串。
- 安装头文件与共享库。
静态库和动态库的区别
- 静态库的扩展名一般为“.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。
头文件路径
-
include <hello/hello.h>
.cpp文件这样include是可以,包含D:/test/hello/hello.h。 -
关键字:
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_PATH
和 CMAKE_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