笔者的笔记本预装了正版的windows,由于空间有限,不想装双系统,但是需要gcc和CMake来编译,所以在Windows 10下配置gcc、CMake和Eigen环境(编译项目需要用到Eigen—一个C++高效的线性代数运算库,下载地址)。
Windows系统中GCC和CMake配置
笔者下的是压缩包形式,解压后得到两个文件夹cmake-3.17.0-rc3-win64-x64
和mingw64
。把这两个文件夹都复制到C:\Program Files
文件夹下。复制完成后,系统还不能检测到这两个工具,例如,打开powershell工具输入gcc,报错:
PS C:\Users\PeaSt> g++
g++ : 无法将“g++”项识别为
cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1
+ g++
+ ~~~
+ CategoryInfo : ObjectNotFound: (g++:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
因为没有添加系统变量,下面添加环境变量:
右击我的电脑—属性—高级系统设置—环境变量—双击用户变量的“Path”:
把C:\Program Files\cmake-3.17.0-rc3-win64-x64\bin
和C:\Program Files\mingw64\bin
添加到用户变量中,确定即可。
重启powershell,输入gcc,发现已经能检测到gcc了,只是因为没有传入要编译的文件,所以有报错,这个问题不大:
PS C:\Users\PeaSt> gcc
gcc.exe: fatal error: no input files
compilation terminated.
PS C:\Users\PeaSt>
编译器用VS Code,因为VS Code和CMake配合较好,有很好的插件可用。
VS Code下载链接
打开VS Code,点击Extension选项:
搜索、安装C/C++插件:
再搜索、安装CMake插件:
再搜索、安装CMake Tools插件:
再搜索、安装C++ Intellisense插件(智能提示辅助插件):
在VS Code中设置gcc编译器,点击编译器选项:
在下拉菜单中选择GCC 8.1.0 (路径是刚才复制到C盘中的mingw64中的gcc编译器,路径:C:\Program Files\mingw64\bin\gcc.exe
)
当左下角的蓝色条里显示“GCC 8.1.0”时,表示已设置GCC为当前编译器。
下面开始测试GCC及CMake功能:
新建一个测试文件test.cpp,写入:
#include <iostream>
using namespace std;
int main(void){
cout << "Hello World" << endl;
return 0;
}
再新建一个CMakeLists.txt,写入:
project(TEST_CMAKE) #编译项目名为TEST_CMAKE
add_executable(test_cmake test.cpp) #使用test.cpp源文件编译可执行程序test_cmake.exe
写完后按下保存Ctrl+s即可自动开始编译。
编译成功后会生成build文件夹,并生成Makefile,相当于只要保存写好的CMakeLists.txt文件,VS Code就会自动完成cmake ..
这个命令:
进入包含该Makefile的build文件夹:
cd build
注意,在Windows下make要使用mingw32-make.exe
命令而不是make
,下面开始make:
mingw32-make.exe
make成功:
PS D:\wincpp\build> mingw32-make.exe
Scanning dependencies of target test_cmake
[ 50%] Building CXX object CMakeFiles/test_cmake.dir/test.cpp.obj
[100%] Linking CXX executable test_cmake.exe
[100%] Built target test_cmake
可见在该build文件夹生成了可执行文件test_cmake.exe:
执行该可执行文件,成功输出了Hello World:
PS D:\wincpp\build> ./test_cmake.exe
Hello World
Windows下gcc及CMake工具配置成功。
Eigen包引入
在编译项目文件时,创建build文件夹,进入之,运行cmake:
cmake ..
发现报错missing: EIGEN_INCLUDE_DIR
:
CMake Error at C:/Program Files/cmake-3.17.0-rc3-win64-x64/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
Could NOT find Eigen (missing: EIGEN_INCLUDE_DIR)
Call Stack (most recent call first):
C:/Program Files/cmake-3.17.0-rc3-win64-x64/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:445 (_FPHSA_FAILURE_MESSAGE)
cmake/FindEigen.cmake:40 (find_package_handle_standard_args)
CMakeLists.txt:6 (find_package)
原因是缺少Eigen包,在Eigen官网下载该包后,还需要进行编译才能使用。
下载好Eigen包后,解压进入该文件夹:
使用VS Code打开该文件夹:
在上面的测试文件test.cpp中加入#include <eigen/Dense>
以引用该库:
#include <iostream>
#include <eigen/Dense>
using namespace std;
int main(void){
cout << "Hello World" << endl;
return 0;
}
VS Code中下划线提示错误:
原因:CMakeLists.txt中为包含其头文件,把eigen总文件夹下面的Eigen文件夹包含进去即可,加入include_directories("D:\wincpp\eigen\Eigen")
后保存:
project(TEST_CMAKE)
include_directories("D:\wincpp\eigen\Eigen")
add_executable(test_cmake test.cpp)
发现报错Invalid escape sequence \w
:
[cmake] Syntax error in cmake code at
[cmake]
[cmake] D:/wincpp/CMakeLists.txt:3
[cmake]
[cmake] when parsing string
[cmake]
[cmake] D:\wincpp\eigen\Eigen
[cmake]
[cmake] Invalid escape sequence \w
原因:上面CMakeLists.txt文件中写入的地址中使用了反斜杠“\”。
解决方法:把上述地址的反斜杠改为正斜杠“/”即可:
project(TEST_CMAKE)
include_directories("D:/wincpp/eigen/Eigen")
add_executable(test_cmake test.cpp)
cmake成功。
下面进入包含test_cmake.exe测试可执行文件的build文件夹,再make加入了#include <eigen/Dense>
(引入Eigen头文件)语句的项目:
进入build文件夹后 运行:
mingw32-make.exe
报错:
D:\wincpp\test.cpp:2:10: fatal error: Eigen/Dense: No such file or directory
#include <Eigen/Dense>
^~~~~~~~~~~~~
compilation terminated.
因为引入头文件<Eigen/Dense>不成功,依然画着红色波浪线:
把Eigen/删掉即可:
再次cmake,成功:
PS D:\wincpp\build> mingw32-make.exe
Scanning dependencies of target test_cmake
[ 50%] Building CXX object CMakeFiles/test_cmake.dir/test.obj
[100%] Linking CXX executable test_cmake.exe
[100%] Built target test_cmake
在test.cpp文件中写入Eigen测试代码,创建一个名为matrix1的2*2矩阵,然后分别赋值,在main函数里调用输出:
#include <iostream>
#include <Dense>
using Eigen::MatrixXd;
using namespace std;
void testEigen(void){
MatrixXd matrix1(2,2);
matrix1(0,0) = 3;
matrix1(1,0) = 2;
matrix1(0,1) = -1;
matrix1(1,1) = matrix1(0,0) + matrix1(0,1);
cout << matrix1 << endl;
}
int main(void){
cout << "Hello World" << endl;
testEigen();
return 0;
}
保存后再编译,通过:
PS D:\wincpp\build> mingw32-make.exe
Scanning dependencies of target test_cmake
[ 50%] Building CXX object CMakeFiles/test_cmake.dir/test.obj
[100%] Linking CXX executable test_cmake.exe
[100%] Built target test_cmake
运行该测试文件:
./test_cmake.exe
输出:
PS D:\wincpp\build> ./test_cmake.exe
Hello World
3 -1
2 2
可见Eigen库中的矩阵运算相关函数可以成功调用,测试完毕。