Windows10机器上安装Ubuntu系统编译C++程序
Windows10机器上安装Ubuntu系统编译C++程序
一、虚拟机安装Ubuntu系统
1.安装环境
1.VMware17
2.Ubuntu 18.04.6 LTS
2.安装注意事项
1.安装时选择【典型】|【稍后安装】选择[Linux]|[ubuntu 64]
2.需要右键挂载ISO文件出现PXE-E53:NO boot filename received解决办法。即右键 “CD/DVD” 【设备状态】 勾选 启动时连接
3.配置Ubuntu系统访问Windows共享目录
在Ubuntu系统打开文件夹,左边导航栏选择【Other Locations】打开后,在下面的【Connect to Server]输入smb开头的共享目录路径:如smb://192.168.24.84/software/
二、开发环境配置
1.安装gcc,g++
1.离线安装方式
因为是内网机器,为了离线安装gcc,g++花费了一些功夫.步骤总结如下:
1)进入网站https://packages.ubuntu.com/
2)找到自己系ubuntu统版本对应的包如下:如果是22.04LTS版本就进入jammy (22.04LTS)链接Browse through the lists of packages:focal (20.04LTS)focal-updatesfocal-backportsjammy (22.04LTS)
3)如果安装gcc和g++找到AMD平台版本(笔者用的AMD平台)
4)每个包列出了详细的必须依赖的包(这个过程有店繁琐,因为会嵌套依赖,需要下载所有的嵌套依赖包)
5)将所有的依赖包放到一个目录,使用sudo dpkg -i *.deb 可以自动一次安装所有的包(依赖顺序会自己解决掉)
2.cmake安装
1.在外网环境可以使用命令安装
sudo apt install cmake
如果需要卸载使用如下命令
sudo apt-get remove cmake
2.指定版本Cmake安装
在使用命令安装时会根据系统版本安装固定的版本,如果想安装特定的版本,可以下载相应的cmake的tar.tz包进行解压安装。具体参考ubuntu18.04下cmake的安装
3.离线安装vscode及插件
1.官网上下载Ubuntu安装
1.下载vscode xxx.deb安装包
2.使用命令
sudo dpkg –i xxx.deb
2.离线安装ms-vscode.cpptools插件
-
下载ms-vscode.cpptools插件
ms-vscode.cpptools用于调试C++程序,在官网下载VSCode对应的版本例如: ms-vscode.cpptools-1.17.5@linux-x64.vsix
-
安装ms-vscode.cpptools插件
点击左边导航栏【扩展】(ctrl+shift+x),在【扩展】视口中最右边【...]选择【从VSIX安装】
三、编译依赖库
在编译源代码的时候,下载需要源代码,解压后,一般主要步骤如下:
1如果目录下有.configure就直接命令行输入./configure ,一般会在后续加上--prefix指定安装路径。(生成MakeFile文件)。如果代码支持camke方式,还可以通过cmake构建MakeFile文件.
2.使用make命令编译源代码
3.使用make install命令将生成的lb,include,bin文件安装你设置的 ./configure中设置的--prefix目录下。
sudo ./configure --prefix='安装目录'
#如果是cmake方式构建MakeFile文件
#sudo mkdir ./build (在当前目录源代码目录下创建一个build目录)
#sudo cd ./build (切换到build目录)
#sudo cmake -DCMAKE_INSTALL_PREFIX='你安装的目录' .. (主要需要加两点,表示build目录上一级目录,因为CMakeList.txt文件是源代码根目录的)
sudo make
sudo make install
1.编译Sqlite
2.编译Proj4
1.使用gdal-3.3.1 linux(Ubuntu) 编译(附SQLite3 PROJ6编译) 编译proj4库 使用./configure生成makefile文件然后用make命令,设置了链接库但是总是报 : undefined reference to sqlite3_open',网上说需要修改makefile文件,参考[[undefined reference to
sqlite3_open']](https://blog.csdn.net/zhxg576/article/details/97392872),修改LIBS= 添加-lsqlite3,但是make还是报undefined reference to sqlite3_open'错。参考如下命令可以指定SQLITE3_CFLAGS,SQLITE3_LIBS.不用修改.bashrc设置用户环境变量
sudo ./configure SQLITE3_CFLAGS="-I/usr/local/gdal_deps/include" SQLITE3_LIBS="-L/usr/local/gdal_deps/lib -lsqlite3" --prefix=/usr/local/proj3.6.2
如果还是undefined reference to `sqlite3_open'错,需要使用ldconfig -p查看下是否libsqlite3.so.xx有多个路径,删除掉不是是路径bian'yi下的libsqlite3.so.xx文件并使用ldconfig生效
2.configure: error: Please install sqlite3 binary.
使用 sudo cp /usr/local/gdal_deps/bin/sqlite3 /usr/local/bin/ 或 建立软链接 sudo ln -s /usr/local/sqlite3/bin/sqlite3 /usr/bin/sqlite3
参考
3.编译GDAL
1.编译gdal碰到 libgdal.so :undefined reference to "proj_create解决办法打开 apps/GNUMakefile 文件,在前面添加一行 CONFIG_LIBS = -L/home/usr/local/proj3.6.2/lib -lproj 参考linux下编译GDAL3.x(集成Proj和Geos等)
2.碰到 /usr/bin/ld: cannot find -lxxx 解决办法 Linux下库文件的设置 (/usr/bin/ld: cannot find -lxxx 的解决办法) Linux 间接引用 .so 的路径问题
3.编译碰到gdalinfo_bin.cpp:undefined reference to 'VSIFree'gdalinfo_bin.cpp:undefined reference to 'GDALOpenEx'
CONFIG_LIBS = -L/home/usr/local/gdal3.5.0/.libs -lgdal
参考
gdal-3.3.1 linux(Ubuntu) 编译(附SQLite3 PROJ6编译)
proj4-6.3.1编译及使用示例(camke构建然后make命令)
4.编译OpenCV
因笔者使用OpenCV库比较基础,只是用了opencv_core、openc_imgproc、opencv_imgcodecs库。这些库不用下载依赖,直接下载tar.gz包解压编译安装即可.
说明:笔者开始为了方便不想编译opencv就使用命令安装libopencv-dev,但是可能和gdal库底层有些公共库有冲突,命令安装libopencv-dev使用的依赖库版本低。导致gdal动态库找的其他低版本,但我又没装低版本gdal动态库。所以卸载libopencv-dev并从源码安装解决了冲突问题。
卸载libopencv-dev
sudo apt-get purge libopencv*
安装libopencv-dev
sudo apt install libopencv-dev
查看opencv版本号
pkg-config --modversion opencv
参考
Ubuntu 20.04下搭建C++ & OpenCV 4.6.0 & cmake编译
四、配置VSCode工程
1.task.json配置
1.这里最需要注意的是-I后面配置是c++包含头文件目录,-L指向动态库目录,-l指向动态库名称。
2.-o"指的是输出执行文件路径
3.-std=c++17指的标准库版本
4.-g的参数设置,如果vscode下有多个cpp文件,需要设置为“${workspaceFolder}/*.cpp”,这个主要是让目录下所有的cpp参入编译。否则会出现莫名的找不多方法的实现。
{
"tasks": [
{
"type": "cppbuild",
"label": "main",
"command": "/usr/bin/g++",
"args": [
"-std=c++17",
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-I","/usr/local/gdal-3.5.0/include",
"-L","/usr/local/gdal-3.5.0/lib",
"-l","gdal",
"-L","/usr/local/proj-6.3.2/lib",
"-l","proj",
"-L","/usr/lib/x86_64-linux-gnu",
"-I","/usr/local/opencv-3.4.5/include",
"-L","/usr/local/opencv-3.4.5/lib",
"-l","opencv_core",
"-l","opencv_imgproc",
"-l","opencv_imgcodecs"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
2.c_cpp_properties
需要注意"includePath"要包含使用的头文件目录,如果不配置无法找到头文件
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/gdal-3.5.0/include",
"/usr/local/opencv-3.4.5/include"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
3.launch.json
需要注意
1."program",需要设置与task.json 中-o后面设置成一样.
2."args" 用来设置控制台输入参数,参数间用逗号隔开.该参数类似于vsstudio 属性设置的命令行参数。
3."preLaunchTask" 需要设置为与Task.json中的"label"设置参数保持一致,否则会导致修改代码调试不能立即生效。
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": ["-i","/home/input","-o","/home/output"],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
//在此处添加一行代码,这里的main应该与上方的program中的可执行文件名相同
"preLaunchTask":"main"
}
]
}
五、调试编译VSCode工程
1.编译gdal写程序
碰到 “error while loading shared libraries: xxx.so.x” 这个问题就是没有找到so文件,但是环境变量文件~/.bashrc 中设置了proj和gdal的lib还是起不到作用。网上说这种方法会因权限等原因找不到。一种一劳永逸的方法就是在 /etc/ld.so.conf文件中添加 proj和gdal的lib路径即可. 参考 “error while loading shared libraries: xxx.so.x“找不到库解决办法
六、源代码、控制台中文乱码问题
从windows平台 vsstudio中拷贝代码到ubuntu vscode打开源代码乱码的问题 需要将windows平台上vsstudio代码用记事本打开另存为UTF-8编码. vscode打开必须使用UTF8编码打开(默认)。如果vscode用GBK编码打开,虽然源代码里没有乱码,但控制台输出仍是乱码。
七、打包so动态库文件
1.导出*.so文件命令
ldd helloworld | awk '{print $3}' | xargs -i cp -L {} /home/zz/lib
2.部署程序编写run.sh批出文件
export LD_LIBRARY_PATH= ../export_lib/
./demo
其中export_lib是导出的*.so动态库文件
八、后续问题
打包拷贝到高版本ubuntu系统可能出现的问题。可能和glibc库有关,因为不同操作系统的glibc库不同。
1.运行程序报错:Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init:说明:这个实际上是libc.so.6找不到对应的GLIBC导致的。查看如下链接
2.ldd libc.so.6命令出现 'GLIBC_2.28' not found/lib64/libc.so.6: version `GLIBC_2.28' not found (required by ./bin/mysqld)
3.glibc 版本(version `GLIBC_2.14' not found)问题
4.Linux部署程序之glibc兼容性问题(非常好的文章)