OpennurbsRhion的一个开源几何库,用起来挺舒服的,虽然不带大部分几何运算功能(什么曲线相交、长度、曲面相交等等),但是用它做一些基本的几何数据存储和分发还是妥妥的足够了。

它是MIT License。妙啊。

Opennurbs 的下载地址是 https://github.com/mcneel/opennurbs 。

目前,笔者只成功地编译了它的静态库。

有经验的同学们如果在使用 Visual Studio 编译 Opernnubs 时遇到了 Freetype 2.6.3 相关问题, 具体表现为:

Error C2065 'AF_SCRIPT_CYRL': undeclared identifier   freetype263_staticlib   ...\opennurbs\freetype263\src\autofit\afstyles.h    100 

那么问题很简单,仅需修改一个地方即可成功:

  1. freetype263_staticlib 项目的 External Dependencies(外部依赖项) 中找到 afscript.h 文件;
  2. 在该文件的第44行找到带 /* */ 的注释;
  3. 删掉该注释,或者在 */ 注释结束符号前加入一个空格即可。

这个bug是微软VC++编译器的锅,该编译器在遇到 “某些特定 Unicode 字符后紧跟 */ 多行注释结束符” 时,会出现无法正确识别注释结束符号的情况。

准备工作

  1. Visual Studio
    提笔写这篇文章的时候,VS2017以前的版本也挺难下载到了,好在2017、2019都能编译,这里就用2019,区别不大
  2. 下载好的opennurbs
    无论是git clone或者是直接打包下载源码,只要确保所有的文件能下载下来就行

笔者这里使用的是git,存放在E:\demo文件夹下。

别的好像也没了,直接打开源码,找到 opennurbs_public.sln 这个VS解决方案文件,直接进行一个打开,进入熟悉的VS界面,准备开工。

尝试编译静态库…

我们可以看到一共有9个C++项目,其中6个是Example,也就是示例,我们并不关心它们。

我们关心的是 opennurbs_public_staticlib 这个静态库项目。直接在该项目上点击右键,选择build编译。

成功了,nice。

妙啊!那现在我们就直接来试试用刚刚编译成功的静态库来创建自己的一个C++程序吧!

使用opennurbs创建自己的C++项目

再打开一个Visual Studio,创建一个C++的Console项目,放在与刚刚openurbs平级的文件夹下。

main函数里加入下面的测试代码,创建几个三维点,然后求它们之间的距离:

#include <iostream>
#include "..\..\opennurbs\opennurbs_public.h"int main()
{ON_3dPoint pts[4];pts[0] = ON_3dPoint{ 1,3,5 };pts[1] = ON_3dPoint{ 3,4,5 };pts[2] = ON_3dPoint{ 3,1,5 };pts[3] = ON_3dPoint{ 3,4,9 };std::cout << pts[3].DistanceTo(pts[1]) << std::endl;
}

直接进行一个运行…… 报错了! 熟悉C++的同学肯定已经发现了,光添加了头文件,还没把刚刚我们编译好的.lib文件告诉链接器,当然会报错。

.h文件就如同一本书的目录,而.lib就是正文了。光是把目录在哪里告诉了我们的测试程序,正文却没有告诉它在哪里,它照着目录去找到时候发现是一堆空气,当然要报错了,嘿嘿,赶紧补上.lib文件的位置说明。

右键点击我们的项目,选择属性,在Linker中把我们在上一步骤中编译好的opennurbs静态链接库加入。

这里有2个步骤,先要添加lib文件所在的文件夹,再添加所需要链接的具体的lib文件。

这回应该没问题了吧!直接运行

还是报错?熟悉的 LINK 2019 错误。链接器未能找到函数blablablabla…… 理论上来说,我们的程序应该只依赖了opennurbs这一个库,这个库的.h文件和.lib文件我们已经正确地引用了,不应该出现别的文件缺失了。只可能是opennurbs的静态库文件中引用了别的库文件,而这个文件我们没有添加到自己的项目中来。

这只能去看opennurbs源码来确定它链接了哪些库文件了。

寻找缺失的lib文件

仔细一看,提示缺少的函数都是在 ON_FileSystem 空间下的4个函数,名字分别是

  • IsFile(char const*)
  • IsFile(wchar_t const*)
  • IsDirectory(char const*)
  • IsDirectory(wchar_t const*)

我们看看源码中的函数定义吧。找到对应的opennurbs_file_utilities.hopennurbs_file_utilities.cpp,这里其实主要是看.cpp文件,因为这里面有具体的函数实现。

果然我们找到了IsFile(char const*)这个函数的实现

发现它这里会判断是否是微软的编译器(MSC, MicroSoftCompiler),如果是的话,则会使用微软的api函数PathFileExistsA(LPCSTR)PathIsDirectoryA(LPCSTR)。这不就正好是我们自己测试程序中链接器报错提示的函数吗?

看来是我们自己的测试程序中少了对微软api的链接。

进行一个网络搜索,发现该函数是在Shlwapi.h头文件内,需要在链接库内加入Shlwapi.lib

https://docs.microsoft.com/en-us/windows/win32/api/shlwapi/nf-shlwapi-pathfileexistsa

回到我们的测试程序,在链接器的链接目标中加入Shlwapi.lib

再次运行我们的测试程序,运行成功!

显示结果是4,让我们来看看这两个点的坐标 { 3, 4, 5 } 和 { 3, 4, 9 },距离的确是4,没问题。再多测几个:

#include <iostream>
#include "..\..\opennurbs\opennurbs_public.h"int main()
{ON_3dPoint pts[4];pts[0] = ON_3dPoint{ 1,3,5 };pts[1] = ON_3dPoint{ 3,4,5 };pts[2] = ON_3dPoint{ 3,1,5 };pts[3] = ON_3dPoint{ 3,4,9 };for (auto& i : pts){for (auto& j : pts){if (i != j){printf_s("Distance from (%1.0f, %1.0f, %1.0f) to (%1.0f, %1.0f, %1.0f) is: ",i.x, i.y, i.z, j.x, j.y, j.z);std::cout << i.DistanceTo(j) << std::endl;}}}
}

完美运行。

愉快地玩耍opennurbs即将开始。

「opennurbs」我直接进行一个Opennurbs的手动编译相关推荐

  1. 「Unity2D」使用Unity创建一个2D游戏系列-1

    「Unity2D」使用Unity创建一个2D游戏系列-1 安装unity并且创建你的第一个场景 在第一章,你将会学习到一些非常基本的内容:首先是unity的下载和安装,其次是准备创建我们游戏内的第一个 ...

  2. 苹果要和 ARM 在 WWDC 举办「婚礼」,定义下一个 10 年

    从 x86 到 ARM,暗藏的是苹果全终端生态一体的野心. 就在 ARM 中国上演宫斗大戏时,另一条关于 ARM 的动态更值得关注. 近日,据彭博社 Mark Gurman 披露,苹果或将在 6 月 ...

  3. 「Unity2D」使用Unity创建一个2D游戏系列-9

    菜单选项 - 载入和重启游戏 本文由泰然教程组成员 betterdenger 翻译,原文请参阅「Menus - loading and restarting the game」 我们已经完成了我们游戏 ...

  4. 李宁「向上」:不止缺一个FILA

    文|螳螂观察 作者|易不二 随着卡塔尔世界杯拉开战幕,今年年初大幅下跌的阿迪和耐克,正在借助世界杯大放异彩. 据统计,在2022年的32强世界杯球衣中,耐克.阿迪.彪马三家品牌共包揽了80%.世界杯球 ...

  5. js ...运算符_「 giao-js 」用js写一个js解释器

    前言 在这篇文章中,我们将通过 JS 构建我们自己的 JS 解释器,用 JS 写 JS,这听起来很奇怪,尽管如此,这样做我们将更熟悉 JS,也可以学习 JS 引擎是如何工作的! 什么是解释器 (Int ...

  6. 「Unity2D」使用Unity创建一个2D游戏系列-8

    现在我们通过使用粒子改进了游戏的视觉效果,接着我们会在工程里里添加一些音乐和声音.使用Unity我们可以很简单做到,但是这部分却对游戏非常重要重要. 你会学到在哪里去找游戏的声音和音乐,选取一些声音用 ...

  7. 在职场中,该如何提升「领导力」让自己成为一个开明的领导者?

    领导力是在职场中非常重要的一项能力,它不仅能够帮助你更好地管理团队,还能够让你更好地与同事.上级沟通,提高自己的职业发展.那么,在职场中,如何提升领导力,成为一个开明的领导者呢? 建立信任和尊重 领导 ...

  8. 「独立思考」的背后是一个残酷的世界

    大家好,我是涩郎,一名「知识挖掘师」兼「知识布道师」. 最近关于中国年轻人缺乏独立思考的话题又上了热搜,原因是网易老板丁磊在网易有道精品课的直播间谈到选人标准时,丁磊表示,网易选人最重要的素质就是 & ...

  9. 史上最「奇葩」的十大编程语言,最后一个有毒……

    关注「实验楼」,每天分享一个项目教程 当你看到这些编程语言时,你的反应应该是「这人一定很闲」.「同是九年义务教育,他为什么这么优秀」.「这人有毒吧」-- 正文共:2220 字 预计阅读时间:7 分钟 ...

  10. 从 Spring Cloud 看一个微服务框架的「五脏六腑」

    点击上方"Java学习之道",选择"关注"公众号 每天早晨,干货准时奉上! 本文作者:酷家乐前端团队 来自:webfe.kujiale.com/spring-c ...

最新文章

  1. CentOS 6.6下双网卡共享上网配置
  2. 中南林科大c语言程序设计,2017年中南林业科技大学计算机与信息工程学院802C语言与数据结构之C程序设计考研题库...
  3. 角色管理与今日内容介绍
  4. runloop解决Cell上主线程卡顿
  5. Account Hierarchy in SAP CRM and C4C
  6. 利用linux curl爬取网站数据
  7. 【html、CSS、javascript-9】jquery-选择器及过滤器
  8. python3d绘图代码_python机器学习之3D Matplotlib绘图
  9. 从模板引擎到模板引擎-使用aspx页面作为模板引擎的一种实现
  10. prezi desktop
  11. 计算机专业学微机原理与接口技术,信息技术学院计算机科学与技术专业《微机原理与接口技术.doc...
  12. java ssh超市进销存管理系统(源码+文档)【源码分享】
  13. 爬虫入门-爬取有道在线翻译结果(1)
  14. 第四周作业-多线程编程
  15. 那个80后程序员,7年创业4次,公司市值750亿美金,全球5万员工!
  16. 华为设备配置BGP负载分担
  17. 需求工程-学习通习题-太原理工大学(14-17章)
  18. Linux centos7 DNS服务器基于bind正反解析服务的搭建
  19. 四川计算机专业的二本大学排名及分数线,2019-2020四川二本大学排名及分数线(理科+文科)...
  20. 小融资 大趋势 小嗨互联网融资研究分析 20190101-20190104

热门文章

  1. uniapp微信小程序video视频监听播放时间
  2. 砍价小程序有人做过吗?调用多多砍价记录,可以转口令或者链接的那种
  3. 手工笔筒制作教程(附彩色贴图分享)
  4. 裴礼文数学分析中的典型问题与方法第2章一元函数的连续性练习
  5. wps安装Mathtype插件遇到的问题
  6. SGD ,Adam,momentum等优化算法比较
  7. 工具-IDM(Google浏览器下载插件)
  8. Autojs4脚本大合集(薅羊毛专业版的脚本)
  9. csdn专用必杀技----谷歌浏览器插件
  10. 统计学 贾俊平 笔记