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

news2024/11/27 23:34:34

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.38
      HostName 124.221.184.38
      User 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=no
    
    make 
    
    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=no
    
    make 
    
    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 {
		//SimpleW3DStreamProcessor
		GetW3DJsonInstance 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.coloradmin.cn/o/1590416.html

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

相关文章

GMSSL-通信

死磕GMSSL通信-C/C++系列(一) 最近再做国密通信的项目开发,以为国密也就简单的集成一个库就可以完事了,没想到能有这么多坑。遂写下文章,避免重复踩坑。以下国密通信的坑有以下场景 1、使用GMSSL guanzhi/GmSSL进行通信 2、使用加密套件SM2-WITH-SMS4-SM3 使用心得 ​…

影响小程序SSL证书收费标准的因素有哪些?

在当今互联网时代&#xff0c;移动应用发展日新月异&#xff0c;小程序逐渐成为广大企业和个人开发者的心仪之选。然而&#xff0c;伴随小程序的广泛应用&#xff0c;安全问题和用户信任显得尤为关键。为了确保小程序的信息传输安全&#xff0c;SSL证书成为了一项基础配置。那么…

【C++题解】1028 - 输入一个三位数,把个位和百位对调后输出

问题&#xff1a;1028 - 输入一个三位数&#xff0c;把个位和百位对调后输出 类型&#xff1a;基础问题 题目描述&#xff1a; 输入一个三位自然数&#xff0c;然后把这个数的百位数与个位数对调&#xff0c;输出对调后的数。 输入&#xff1a; 输入一行&#xff0c;只有一…

独一无二:探索单例模式在现代编程中的奥秘与实践

设计模式在软件开发中扮演着至关重要的角色&#xff0c;它们是解决特定问题的经典方法。在众多设计模式中&#xff0c;单例模式因其独特的应用场景和简洁的实现而广受欢迎。本文将从多个角度详细介绍单例模式&#xff0c;帮助你理解它的定义、实现、应用以及潜在的限制。 1. 什…

C++格式化输出开源库fmt入手教程

fmt项目快速上手指南 1. cmake环境配置 include(FetchContent) FetchContent_Declare(fmtGIT_REPOSITORY https://github.com/fmtlib/fmtGIT_TAG 10.0.0GIT_SHALLOW TRUE) # 1. 下载fmt库 FetchContent_MakeAvailable(fmt)add_executable(fmt_guide main.cpp) # 2. 链接fmt库…

Java 自定義 List<T> 分頁工具

Java 自定義 List 分頁工具 PS: T可修改为对应的实体 rt com.google.common.collect.Lists;import java.util.Arrays; import java.util.Collections; import java.util.List;/*** ClassName: MyPageHelper* Descripution: List<T>分頁工具**/ public class MyPageHelp…

自动化测试(selenium篇)

这次我们来介绍selenium 我们主要来讲解这几个要点 1.什么是自动化测试 2.什么是selenium 3.为什么来讲selenium 4.selenium的环境搭建 5.selenium的 API 1.什么是自动化测试 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条…

Android Studio 使用Flutter开发第一个Web页面(进行中)

附上Flutter官方文档 1、新建Flutter项目&#xff08;需要勾选web选项&#xff09; 新建项目构成为&#xff1a; 2、配置 Flutter 使用 path 策略 官方文档 在main.dart中&#xff0c;需要导入flutter_web_plugins/url_strategy.dart包&#xff0c;并在main(){}函数中usePath…

水经微图IOS版5.2.0发布

随时随地&#xff0c;微图一下&#xff01; 水经微图&#xff08;简称“微图”&#xff09;IOS新版已上线。 在该版本中主要新增图层树节点排序功能、常规&#xff08;矩形、圆、椭圆、扇形&#xff09;绘制功能、地形夸张等主要功能。 当前版本 当前版本号为&#xff1a;5…

html-蜘蛛

<!doctype html> <html> <head> <meta charset"utf-8"> <title>彩虹蜘蛛-jq22.com</title> <script src"http://www.jq22.com/jquery/jquery-1.10.2.js"></script> <style> </style> </he…

Day:007(2) | Python爬虫:高效数据抓取的编程技术(scrapy框架使用)

Scrapy 数据的提取 Scrapy有自己的数据提取机制。它们被称为选择器。我们可以通过使用的选择器re、xpath、css提取数据 提示 不用再安装与引入Xpath,BS4 获得选择器 Response对象获取 正常使用 response.selector.xpath(//span/text()).get() response.selector.css(span::…

flask毕业设计选题管理系统python+django_96r19

本系统选择编程语言。Pymysql是封装了MySQL驱动的Python驱动一个能使Python连接到MySQL的库。Python语言官方规范访问数据库的统一接口规范(Python DB-API)&#xff0c;防止在使用不同数据库时&#xff0c;由于底层数据库技术不同造成接口程序紊乱的问题。通过本次系统设计可以…

处理json文件,并将数据汇总至Excel表格

从scores.jason文件中读取学生信息,输出学生的学号&#xff0c;姓名&#xff0c;各科成绩&#xff0c;平均分, 各科标准差 效果&#xff1a; # # 从scores.jason文件中读取学生信息,输出学生的学号&#xff0c;姓名&#xff0c;各科成绩&#xff0c;平均分, 各科标准差 impor…

K8S哲学 - 常见的资源类型

资源类型 namespace kubectl apply 和 kubectl create kubectl apply是声明式的 和 kubectl create是命令式的对吗 deployment 和 job的区别 k8s 的 lable 的意义

政安晨:【Keras机器学习实践要点】(二十七)—— 使用感知器进行图像分类

目录 简介 设置 准备数据 配置超参数 使用数据增强 实施前馈网络&#xff08;FFN&#xff09; 将创建修补程序作为一个层 实施补丁编码层 建立感知器模型 变换器模块 感知器模型 编译、培训和评估模式 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍…

RREA论文阅读

Relational Reflection Entity Alignment 关系反射实体对齐 ABSTRACT 实体对齐旨在识别来自不同知识图谱(KG)的等效实体对&#xff0c;这对于集成多源知识图谱至关重要。最近&#xff0c;随着 GNN 在实体对齐中的引入&#xff0c;近期模型的架构变得越来越复杂。我们甚至在这…

STM32—DMA直接存储器访问详解

DMA——直接存储器访问 DMA&#xff1a;Data Memory Access, 直接存储器访问。 DMA和我们之前学过的串口、GPIO都是类似的&#xff0c;都是STM32中的一个外设。串口是用来发送通信数据的&#xff0c;而DMA则是用来把数据从一个地方搬到另一个地方&#xff0c;而且不占用CPU。…

2024年经济发展、社会科学与贸易国际会议(ICEDSST2024)

2024年经济发展、社会科学与贸易国际会议(ICEDSST2024) 会议简介 2024年国际经济发展、社会科学与贸易会议&#xff08;ICEDSST2024&#xff09;将在中国深圳举行&#xff0c;主题为“经济发展、社科与贸易”。ICEDSST2024汇集了来自世界各地经济发展、社科与贸易领域的学者、…

Ubuntu无网络标识的解决方法

1.出现的情况的特点 2.解决办法 2.1 进入root并输入密码 sudo su 2.2 更新NetworkManager的配置 得先有gedit或者vim&#xff0c;两个随意一个&#xff0c;这里用的gedit&#xff0c;没有就先弄gedit&#xff0c;有的话直接下一步 apt-get install gedit 或者vim apt-get ins…

Vim:强大的文本编辑器

文章目录 Vim&#xff1a;强大的文本编辑器Vim的模式命令模式常用操作光标移动文本编辑查找和替换 底行命令模式常用操作Vim的多窗口操作批量注释与去注释Vim插件推荐&#xff1a;vimforcpp结论 Vim&#xff1a;强大的文本编辑器 Vim&#xff0c;代表 Vi IMproved&#xff0c;…