AutoCAD之DWF三维信息提取---linux编译篇

1. 权限

1.1 给文件添加执行权限
chmod +x autogen.sh
1.2.给当前文件下的所有文件改变为读写执行权限
chmod 777 * -R 

2.环境安装

2.1安装automake 1.4.1

安装链接

安装中遇到的问题及解决

2.2安装autoconf
2.3 安装libtool
2.4 安装Cmake(CMake包含)

cmake安装在centos上

2.5 安装java

卸载openjdk安装jdk

3.linux环境下编程预热

3.1前备知识

makefile:与平台相关的用于组织项目编译链接的这样一种文件,make 是用来执行Makefile的

CMakeLists.txt:是一种跨平台的组织项目编译和链接的文件,最后会转化为与平台相关的makefile;

Cmakes是一种构建工具(cmake是跨平台项目管理工具),可以生成makefile,也可生成CmakeLists.txt,cmake命令执行的CMakeLists.txt文件。CMakeLists.txt一般都是自己写。

具体使用时,Linux下,小工程可手动写Makefile,大工程用automake来帮你生成Makefile,要想跨平台,就用cmake。

如何在Linux环境下编程,可以选用VS2019+cmake的方式实现远程开发 vs2019+cmake linux远程开发

make makefile cmake的解释

  • 自动构建makefile的工具autotools或者automake
image-20220326182646010
  • CMake工具
image-20220326184141680
CMakeLists.txt

CMakeLists.txt的编写教程

Cmake命令教程

CMake语法解析

  1. CMakeLists.txt 的语法比较简单,由命令、注释和空格组成
  2. 命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔

常用命令

官方手册命令

cmake_minimum_required
#指定运行此配置文件所需的 CMake 的最低版本;
project
#项目名称
add_executable
#编译成可执行文件
aux_source_directory(<dir> <variable>)
#该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。
#aux_source_directory(. DIR_SRCS)
#add_executable(Demo ${DIR_SRCS})
add_subdirectory
#添加子目录
target_link_libraries
#添加链接库
add_library
# 生成链接库
configure_file 
## 加入一个配置头文件,用于处理 CMake 对源码的设置
set
# 设置变量值?

例子1:

image-20220326224025261
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)# 项目信息
project (Demo3)# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)# 添加 math 子目录
add_subdirectory(math)# 指定生成目标 
add_executable(Demo main.cc)# 添加链接库
target_link_libraries(Demo MathFunctions)

math文件下的CMakeLists.txt

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)# 生成链接库
add_library (MathFunctions ${DIR_LIB_SRCS})

例子2:例子2

常用变量

官方手册cmake变量

变量名含义
PROJECT_NAMEproject命令中写的项目名
CMAKE_VERSION当前使用CMake的版本
CMAKE_SOURCE_DIR工程顶层目录,即入口CMakeLists文件所在路径
PROJECT_SOURCE_DIRCMAKE_SOURCE_DIR
CMAKE_BINARY_DIR工程编译发生的目录,即执行cmake命令进行项目配置的目录,一般为build
PROJECT_BINARY_DIRCMAKE_BINARY_DIR
CMAKE_CURRENT_SOURCE_DIR当前处理的CMakeLists.txt所在的路径
CMAKE_CURRRENT_BINARY_DIR当前处理的CMakeLists.txt中生成目标文件所在编译目录
CMAKE_CURRENT_LIST_FILE输出调用这个变量的CMakeLists.txt文件的完整路径
CMAKE_CURRENT_LIST_DIR当前处理的CMakeLists.txt文件所在目录的路径
CMAKE_INSTALL_PREFIX指定make install命令执行时包安装路径
CMAKE_MODULE_PATHfind_package命令搜索包路径之一,默认为空

编译配置相关变量:

变量名含义
CMAKE_BUILD_TYPE编译选项,Release或者Debug,如set(CMAKE_BUILD_TYPE "Release")
CMAKE_CXX_FLAGS编译标志,设置C++11编译,set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
CMAKE_CXX_STANDARD也可以设置C++11编译,set(CMAKE_CXX_STANDARD 11)

执行

cmake .  [cmake -i]
make

4.Linux下编译dwf2json

4.1通过ssh连接服务器:
  1. xshell生成密钥对,将生成公钥上传到腾讯云的密钥中,相当于公钥追加到了~/.ssh/authorized_keys文件中,当然也可以手动添加

    #手动添加
    cat id_rsa.pub >>authorized_keys
    
4.2 通过VSCode连接服务器
  1. 将本机生成的密钥对,放到c盘用户目录下的.ssh文件夹下,并且conf中配置

    Host 124.221.184.38HostName 124.221.184.38User root
    
  2. 将公钥追加到~/.ssh/authorized_keys文件

    cat id_rsa.pub >>authorized_keys
    
  3. 如果出现Resolver error: The VS Code Server failed to start 此问题更新vscode的ssh插件即可

4.3 编译jsoncpp
  1. 使用cmake来编译jsoncpp;先下载jsoncpp

    新版本的jsoncpp,编译的时候会报错error: ‘hexfloat’ is not a member of ‘std’,我在centos上即使设置了c++11的编译环境,依然报此错,因此下载0.10.7老版本的jsoncpp

    wget https://github.com/open-source-parsers/jsoncpp/archive/refs/tags/0.10.7.tar.gz
    
  2. 解压

    tar zxvf 0.10.7.tar.gz
    
  3. 执行cmake命令

    cd jsoncpp-0.10.7/
    cmake .
    make
    make install
    
  4. 注意如果生成动态链接库,按照下述方式cmake

    cmake -DCMAKE_BUILD_TYPE=release -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=ON -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" .
    
  5. 网上安装教程

4.4 编译dwfcore和dwftoolkit

现在linux下创建文件夹,形成如下目录结构,将源代码文件夹gnu以及src,放到如下目录结构中

image-20220405215228350

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20220405215547484
编译dwfcore
  1. 进入脚本目录,执行脚本

    cd /cwb/dwftoolkitcomplie/develop/global/build/gnu/dwfcore
    ./bulid_setup.sh
    

    如果出现换行符的问题 用dos2unix工具对脚本文件进行一个转义,并且删除多余空行

  2. 进入源文件目录

    cd ../../../src/dwfcore
    
  3. 进行编译

    CXX="g++ -std=c++11" ./configure --with-zlib=no  --with-expat=nomake make install
    
编译dwftoolkit
  1. 进入脚本目录,执行脚本

    cd /cwb/dwftoolkitcomplie/develop/global/build/gnu/dwftoolkit./bulid_setup.sh
    
  2. 进入源文件目录

    cd ../.../../src/dwf
    
  3. 进行编译

    CXX="g++ -std=c++11" ./configure --with-jpeg=nomake make install
    
  4. 将编译好的静态链接库文件和动态链接库文件复制到工程的lib目录下

    cp -ri  /usr/local/lib/* /cwb/lib/
    
5.5 编译dwf2json
  1. 创建工程目录

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建dev 写工程源文件,include放置第三方头文件,lib放置编译好的第三方静态和动态链接库,也即jsoncpp(用哪个版本就用哪个版本的头文件),dwfcore,dwftoolkit (src目录中的头文件)

  1. 编写CMakeLists.txt

注意我一直以为core需要先链接结果,经过几天折腾一直在报错,最后发现dwftoolkit实现了core中的方法,所以把toolkit放core前面,结果不报错,乌鱼子

以及在此过程中遇到的一些错误通过加编译选项得以解决,例如-lpthread -luuid -lz -ldl

cmake_minimum_required(VERSION 3.23.0)
set(PROJECT_DIR "/cwb") #设置项目目录
project(dwf2json)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -Wall -Wno-unused-variable -lpthread -luuid -lz -ldl -fPIC")
#库目录 
include_directories(${PROJECT_DIR}/include)
#链接目录
link_directories(${PROJECT_DIR}/lib)
# 搜索当前文件下得cpp文件
aux_source_directory(${PROJECT_DIR}/dev DIR_SRCS)
#生成可执行文件
#add_executable(dwf2json ${DIR_SRCS})
#生成动态链接库
add_library(dwf2json SHARED ${DIR_SRCS})
#指定链接库 libjsoncpp.a静态链接库和动态链接库名字重了也会报错 
target_link_libraries(dwf2json libjsoncpp.so libdwftk.so libdwfcore.so)
#target_link_libraries(dwf2json newnamelibjsoncpp.a libdwftk.a libdwfcore.a)

注意生成动态链接库的时候,如果其他链接的是静态链接库,会提示我用fpic编译,即使用fpic编译其他链接库,也依然报错,所以最后直接用动态链接库链接

  1. 创建release文件夹,并在此文件夹下编译
cmake ..
make

5.Linux通过jni调用动态链接库

  1. 创建与C++交互的类
package com.ircrisk.fgdm.libraryofdllorso;
public class GetW3DJsonBySoService {static {System.loadLibrary("dwf2json");  //链接库的名字}public native static int getW3DJson(String path,String jsonFile);  //链接库的方法
}
  1. 编译此交互类生成JNI需要的头文件
javac GetW3DJsonBySoService.java

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

javah -classpath . -jni  com.ircrisk.fgdm.libraryofdllorso.GetW3DJsonBySoService

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 引入生成的头文件,重写其中的方法
image-20220405222455184
  1. 编译生成动态链接库
  2. 按理说执行的时候通过-Djava.library.path='.'此命令指定.so的位置即可成功执行,但是执行的时候一直无法找到动态链接库,因此放弃使用JNI改用JNA

[Linux下JNI的用法](Jni教程(一)—Linux下jni调用 - 简书 (jianshu.com))

6.改用JNA调用动态链接库

  1. java调用方的写法
package com.ircrisk.fgdm.libraryofdllorso;
import com.sun.jna.Library;
import com.sun.jna.Native;
ass GetW3DJsonService {public interface GetW3DJsonInstance extends Library {//SimpleW3DStreamProcessorGetW3DJsonInstance INSTANCE = (GetW3DJsonInstance) Native.loadLibrary("dwf2json", GetW3DJsonInstance.class);int  getW3DJson(String file,String jsonfile);}public synchronized int  getW3DJson(String path,String jsonFile){int res= GetW3DJsonInstance.INSTANCE.getW3DJson(path,jsonFile);return  res;}
  1. C++动态链接库的编写,通过extern导出接口
extern "C"{int  getW3DJson(const char* file,const char * jsonfile){....}
}
  1. Springboot项目只需要把libdwf2json放到resource下的linux-x86-64目录,如果不放在linux-x86-64目录下,就会报如下错误,我也是很奇怪,注意linux下生成的so文件会带上lib前缀,所以java代码中加载的时候不要写lib前缀,加载的时候会自动加上lib前缀
image-20220408095936154 image-20220405224022108
  1. 同时在pom文件中进行如下配置,防止.so被压缩
<build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><encoding>UTF-8</encoding><useDefaultDelimiters>false</useDefaultDelimiters><delimiters><delimiter>@</delimiter></delimiters><!-- 过滤后缀不需要转码的文件后缀名so--><nonFilteredFileExtensions><nonFilteredFileExtension>so</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin></plugins></build>

8.linux一些相关命令

查看jdk的安装目录

echo $JAVA_HOME
#or
whereis java

查找目录下的某个文件 并显示详细信息

find ./ -name "automake" |xargs ls -l

查看linux占用内存最大的十个进程

ps auxw|head -1;ps auxw|sort -rn -k3|head -10

9.遇到的问题及解决

9.1模型加载到一半404

模型加载到一半前端404,后端jjava.io.IOException: Broken pipe

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查看nginx日志,接口超时upstream timed out

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

nginx增加超时的配置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后端报java.io.IOException: Broken pipe

niginx报upstream上游服务器关闭

修改gateway的超时时间即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【IDEA】JRebel LS client not configured

主要原因就是因为 jrebel 的版本跟 idea的版本对不上&#xff0c;或者说jrebel的版本比idea的版本还高&#xff0c;导致出现该错误 查看idea版本 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a7ba43e6822947318cdb0d0e9d8d65e9.png 获取jrebel 版本 如何处理 …

java Web 中小企业门户网站用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 中小企业门户网站是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

【论文研读】Geometric Deep Learning on Molecular Representations

Geometric Deep Learning on Molecular Representationshttps://arxiv.org/pdf/2107.12375.pdf 一、Background 随着网络时代的发展&#xff0c;生活中产生的数据量越来越多&#xff0c;但数据大体分为两类&#xff1a;欧氏数据、非欧氏数据。如图为两类常见的数据&#xff0c…

视频秒播优化实践

本文字数&#xff1a;2259字 预计阅读时间&#xff1a;10分钟 视频起播时间&#xff0c;即首帧时间&#xff0c;是视频类应用的一个重要核心指标&#xff0c;也是影响用户观看体验的核心因素之一。如果视频要加载很久才能开始播放&#xff0c;用户放弃播放甚至离开 App 的概率都…

采集某新闻网资讯网站保存PDF

网址&#xff1a;融资总额近3亿美元、药明康德押注&#xff0c;这家抗衰老明星公司有何过人之处-36氪 想要抓取文章内容&#xff0c;但是找不到啊&#xff0c;可能是文字格式的问题&#xff0c;也可能文章内容进行了加密。 在元素中查看&#xff0c;window.initialState返回的就…

QQ 邮箱使用 SMTP 发送邮件报错:550 The From header is missing or invalid

文章目录 场景描述问题排查根据提示查看原因查看封装的 message 个人简介 场景描述 QQ 邮箱使用 SMTP 发送邮件报错&#xff1a;550 The From header is missing or invalid&#xff1a; 失败原因&#xff1a;(550, bThe "From" header is missing or invalid. Ple…

JVM修炼之路【11】- 解决内存溢出、内存泄漏 以及相关案例

前面的10篇 都是基础的知识&#xff0c;包括类加载的过程 类加载的细节&#xff0c;jvm内存模型 垃圾回收 等等&#xff0c; 这一篇我们开始实战了解一下 各种疑难杂症&#xff1a;怎么监控 怎么发现 怎么解决 内存溢出 内存泄漏 这两个概念在垃圾回收器里面已经讲过了&#…

云原生(八)、Kubernetes基础(一)

K8S 基础 # 获取登录令牌 kubectl create token admin --namespace kubernetes-dashboard1、 NameSpace Kubernetes 启动时会创建四个初始名字空间 default:Kubernetes 包含这个名字空间&#xff0c;以便于你无需创建新的名字空间即可开始使用新集群。 kube-node-lease: 该…

【学习】VScode修改侧边栏大小。

侧边栏不可以直接更改&#xff0c;所以先缩放整体界面&#xff0c;再改变工作区大小。 缩放整体界面&#xff1a; Ctrl 或 Ctrl - 。 也可以直接使用如下代码&#xff1a; Ctrl Shifit p 打开搜索 settings &#xff0c;选择下图第一个。 然后嵌入如下代码&#xff1a…

股票价格预测 | Python使用GAN预测股票价格

文章目录 效果一览文章概述代码设计效果一览 文章概述 生成对抗网络(GAN)是一种强大的机器学习模型,用于生成以假乱真的数据。然而,使用GAN来预测股票价格可能会面临以下挑战: 数据可用性:GAN需要大量的数据进行训练,以便生成准确的输出。对于股票价格预测,历史股票价…

OpenHarmony开发——Makefile方式组织编译的库移植

以yxml库为例&#xff0c;其移植过程如下文所示。 源码获取 从仓库获取yxml源码&#xff0c;其目录结构如下表&#xff1a; 表1 源码目录结构 名称描述yxml/bench/benchmark相关代码yxml/test/测试输入输出文件&#xff0c;及测试脚本yxml/Makefile编译组织文件yxml/.gitat…

【示例】Mybatis-标签学习+Mybatis工作流程

前言 本文主要学习Mybatis相关标签的使用及Mybatis的工作流程。 文中用到的示例&#xff0c;代码存储位置&#xff1a; GitHubhttps://github.com/Web-Learn-GSF/Java_Learn_Examples父工程Java_Framework_Mybatis 基础 示例 | 初始Mybatis 数据库初始化 -- 建表 CREATE…

Elasticsearch安装、启动异常问题总结

安装es、kibana、ik分词器可参考&#xff1a;http://t.csdnimg.cn/59mEG 1. 内核过低 我们使⽤的是 centos6 &#xff0c;其 linux 内核版本为 2.6 。⽽ Elasticsearch 的插件要求⾄少 3.5 以上版 本。不过没关系&#xff0c;我们禁 ⽤这个插件即可。 修改 elasticsearch.ym…

spring boot整合Redis监听数据变化

一、前言 Redis提供了数据变化的通知事件&#xff0c;可以实时监测key和value的变化&#xff0c;客户端可以通过订阅相关的channel来接收这些通知事件&#xff0c;然后做相应的自定义处理&#xff0c;详细的介绍可以参考官方文档Redis keyspace notifications | Docs 使用Red…

一次http访问超时服务器端调试

问题&#xff1a;http访问服务器时没有返回&#xff0c;没有超时&#xff0c;一直在阻塞 处理过程&#xff1a;telnet端口能连上&#xff0c;服务端程序也不存在处理时间过长的情况。 说明tcp连接没问题。推测是客户端连接后再发起请求&#xff0c;服务端阻塞了。因为很多客户…

关于 TDengine 的时区(timeZone)问题

背景 在学习SagooIOT物联网平台使用docker部署TDengine时序数据库&#xff0c;根据时间戳&#xff08;timestamp&#xff09;ts查询上报设备数据时 发现结果跟查询条件不匹配。查询问题原因竟然是timezone时区设置问题。 查询数据结果&#xff1a; 查看容器时区&#xff1a; …

分类算法——sklearn转换器和估计器(一)

转换器&#xff08;特征工程的父类&#xff09; 实例化&#xff08;实例化的是一个转换器类&#xff08;Transformer&#xff09;&#xff09;调用fit_transform&#xff08;对于文档建立分类词频矩阵&#xff0c;不能同时调用&#xff09; 把特征工程的接口称之为转换器&…

当你的项目体积比较大?你如何做性能优化

在前端开发中&#xff0c;项目体积优化是一个重要的环节&#xff0c;它直接影响到网页的加载速度和用户体验。随着前端项目越来越复杂&#xff0c;引入的依赖也越来越多&#xff0c;如何有效地减少最终打包文件的大小&#xff0c;成为了前端工程师需要面对的挑战。以下是一些常…

汽车咨询|基于SprinBoot的汽车资讯管理系统设计与实现(源码+数据库+文档)

汽车资讯管理系统目录 基于SprinBoot的汽车资讯管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff…

npm 切换成淘宝源,以及遇到npm 报错如何解决

淘宝源&#xff1a;npm config set registryhttps://registry.npmmirror.com/ 然后再npm下 package-lock.json这个删了 npm i再试一下