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/

参考Ubuntu访问windows共享文件夹

二、开发环境配置

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插件

  1. 下载ms-vscode.cpptools插件

    ms-vscode.cpptools用于调试C++程序,在官网下载VSCode对应的版本例如: ms-vscode.cpptools-1.17.5@linux-x64.vsix

  2. 安装ms-vscode.cpptools插件

    点击左边导航栏【扩展】(ctrl+shift+x),在【扩展】视口中最右边【...]选择【从VSIX安装】

参考 开发工具 - Ubuntu版本VS code离线安装

三、编译依赖库

​ 在编译源代码的时候,下载需要源代码,解压后,一般主要步骤如下:
​ 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

Ubuntu编译安装sqlite3库

Ubuntu18.04中编译SQLite3库

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

参考

proj4-6.3.1编译及使用示例

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---记录.opencv多版本管理与切换

Ubuntu系统---配置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

参考 Linux 下打包可执行程序所有依赖的so 库

2.部署程序编写run.sh批出文件

export LD_LIBRARY_PATH= ../export_lib/
./demo

其中export_lib是导出的*.so动态库文件

参考 ubuntu中C++工程打包所有依赖的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兼容性问题(非常好的文章)

七、其他参考

乌合之众

Linux中的动态库和静态库(.a/.la/.so/.o)

posted @ 2023-10-20 18:15  焦涛  阅读(192)  评论(0)    收藏  举报