1 虚拟机设置
1.1 虚拟机网络设置参考
https://blog.csdn.net/wx2320061619/article/details/104675181/
注意!:贴中第三步vi ifcfg-ens33 创建了文件ifcfg-ens33,建议查看/etc/sysconfig/network-scripts/路径下是否有ifcfg-ensxxxx文件,若有在该文件基础上按照贴中修改参量即可。我的文件是ifcfg-eno16777736。
贴中没有给出防火墙关闭方式,命令:
sudo systemctl stop firewalld 临时关闭
sudo systemctl disable firewalld ,然后reboot 永久关闭
sudo systemctl status firewalld 查看防火墙状态
1.2 脱机状态下虚拟机连接
在实体机中不需要禁用其他网卡,只需要对应修改VMnet8
最后双方能互相ping通即成功连接
2 VS设置
2.1 项目创建
在创建页的的平台选择栏选择“Linux”即可成功创建带跨平台编译的项目
2.2 连接远程系统
工具-》选项-》跨平台
添加连接,实体机在不同的网络中会有不同的网络,会要求虚拟机重新设置,如果采用1.2中的网络设置方法,可以在不同网络中保持实体机和虚拟机的连接
2.3 解决方案属性设置
2.3.1 常规
输出目录:最后的可执行程序的实体机的输出目录,部署后会在虚拟机上保持相同的结构
远程生成计算机:2.2中设置的连接列表中选择
远程(根/项目/部署)目录:对应虚拟机上的目录
2.3.2 调试
程序:默认为工程生成的目录
程序参数:输入给程序的测试参数
工作目录:如果在常规中修改了可执行程序的生成目录,则该处应该进行对应修改
2.3.3 C/C++
附加包含目录:头文件文件夹,应当按照linux方式使用反斜杠,添加后include头文件可免去路径
调试信息格式:修改之后在编译时报错更详细
2.3.4 链接器
附加库目录:填写Windows中so文件所在路径
附加依赖项,把要使用的so文件的文件名添加在这
3 Linux下对应操作
- 附加包含的头文件文件夹和依赖库文件夹不会对应复制去虚拟机,需要自己手动复制
- 在Windows中设置为这样的结构,并且在vs中将生成的可执行程序和cpp文件置于同级路径后,在linux下也复制为相同结构,可以提高一致性
3.在虚拟机对应目录中可见可执行程序,执行ldd命令查看链接库情况,可见添加的链接库not found,因此不能直接执行可执行程序,需要通过shell脚本调用。
4 Shell脚本编写
4.1 创建
在linux终端中:
创建文件 touch compile.sh
赋予权限 chmod +x compile.sh
4.2 执行脚本
一份编译/执行的脚本示例
#!/bin/bash
cd $(dirname $0) 进入脚本所在路径,$0为脚本执行的第一个参数(固有的),为脚本的绝对路径
CURDIR=$(pwd) 将CURDIR变量赋值为当前路径,$为取值符号,要将pwd的值传递给变量,必须使用$()
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH$CURDIR/../bin/Release/ LD_LIBRARY_PATH是一个系统变量名,搜索库所在的,一般初始为空,使用export后,可以搜索路径存在的依赖库
ldd VS_Compile_test_01.out 查看库依赖关系,可见缺少的库已经有了具体的对应
./VS_Compile_test_01.out $1 将传递给脚本的第一个变量名传递给可执行程序
4.3 编译
g++ -o CentOSL3Test.out "libGISManager.so" "libGridDem.so" "libIdpmCoordTrans.so" "libIdpmImage.so" "libIdpmRFMAL.so" "libIdpmVoting.so" "libSIATMatchCore.so" "libWuGeoCvt.so" "libWuOrthoEngine.so" IdpmDem.cpp Ini.cpp RFMOrientation.cpp SIAT_KNL.cpp tinyxml2.cpp AtxIndirectAdjustmentX.cpp
-o(小写O)名称:输出的可执行程序名称
-L “路径” :编译所需库的路径
-l(小写L)”库名”:编译所需的具体的依赖库
-I (大写i)“路径” :include文件夹路径
最后要加上各个编译所使用的头文件对应的源文件
4.4 其他用法
- echo是类似printf的用法,大概三种用法,假设,内容=
- echo 内容 ——内容
- echo ‘$内容’ ——$内容
- echo $内容 ——1
- 获取程序的输出值
- temp=`./VS_Compile_test_01.out $0` ``为键盘上1左侧的按键对应的符号,可以捕捉程序所有的printf出来的内容,并将其去掉换行符,转化为一个字符串
- temp=$(./VS_Compile_test_01.out $0) 与上方相同的效果,捕捉printf内容
- temp=$? 在紧接在可执行程序之后使用,可以捕捉main函数的返回值,如1、0,是一个int
- 基于捕捉程序的输出值,同样可以在脚本中进行运行逻辑的处理
./VS_Compile_test_01.out $0
CATCH=$?
if [ $CATCH <> 0 ];then / if [ "$CATCH" -eq "0" ];then
statement 1
else
statement 2
fi
待续……