Rhino사의 nurbs 취급 라이브러리인 opennurbs 를 mingw로 컴파일 하기 위해서 약간의 수정이 필요한데..
https://www.rhino3d.com/kr/opennurbs/
본 소스는 현재 최신버전으로 아래에서 받았음.
https://github.com/mcneel/opennurbs/archive/refs/tags/v7.6.21127.19001.tar.gz
기본으로 opennurbs 는 윈도우즈상에서의 컴파일은 VC++ 7.0 & 9.0 Community 버전만 지원함.
난 MinGW 를 주로 쓰기 때문에 직접 opennurbs 코드를 수정해서 컴파일 및 테스트까지 성공한 diff 를 올려둠
그리고 컴파일을 위해서는 MinGW용 uuid가 필요함. (https://github.com/h0tw1r3/libuuid-mingw)
사용된 MinGW g++ 버전은 아래와 같음
[MIN@DESKTOP-RSH0QT3 build]$ g++ --version
g++.exe (Rev2, Built by MSYS2 project) 10.3.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
암튼 아래는 diff...
diff -ur opennurbs-7.6.21127.19001/makefile opennurbs-7.6.21127.19001.mingw/makefile
--- opennurbs-7.6.21127.19001/makefile 2021-05-24 10:38:07.000000000 +0900
+++ opennurbs-7.6.21127.19001.mingw/makefile 2021-08-07 01:25:29.550215500 +0900
@@ -15,7 +15,7 @@
# asks too many questions, then uncomment the next line.
# RM = /bin/rm -f
-AR = ar qvl
+AR = ar r
# If your system doesn't use ranlib, uncomment the "echo" define.
RANLIB = ranlib
@@ -27,11 +27,11 @@
# Choose one of the following definitions for GCC_OPTIMIZER_FLAGS
# unoptimized debug build
-ON_GNU_OPTIMIZER_FLAGS = -g
+#ON_GNU_OPTIMIZER_FLAGS = -g
# optimized release build
-#ON_GNU_OPTIMIZER_FLAGS = -O
+ON_GNU_OPTIMIZER_FLAGS = -O
-ON_GNU_WARNING_FLAGS = -Wall \
+#ON_GNU_WARNING_FLAGS = -Wall \
-Wno-overloaded-virtual \
-Wno-switch \
-Wno-unknown-pragmas \
@@ -277,6 +277,7 @@
opennurbs_fsp.cpp \
opennurbs_function_list.cpp \
opennurbs_geometry.cpp \
+ opennurbs_gl.cpp \
opennurbs_glyph_outline.cpp \
opennurbs_group.cpp \
opennurbs_hash_table.cpp \
@@ -454,6 +455,7 @@
opennurbs_fsp.o \
opennurbs_function_list.o \
opennurbs_geometry.o \
+ opennurbs_gl.o \
opennurbs_glyph_outline.o \
opennurbs_group.o \
opennurbs_hash_table.o \
@@ -843,22 +845,22 @@
## $(RANLIB) $@
example_read/example_read : example_read/example_read.o example_userdata/example_ud.o $(OPENNURBS_LIB_FILE)
- $(LINK) $(LINKFLAGS) example_read/example_read.o example_userdata/example_ud.o -L. -l$(OPENNURBS_LIB_NAME) -lm -o $@
+ $(LINK) $(LINKFLAGS) example_read/example_read.o example_userdata/example_ud.o -L. -l$(OPENNURBS_LIB_NAME) -lm -luuid_mingw -lrpcrt4 -o $@
example_write/example_write : example_write/example_write.o example_userdata/example_ud.o $(OPENNURBS_LIB_FILE)
- $(LINK) $(LINKFLAGS) example_write/example_write.o example_userdata/example_ud.o -L. -l$(OPENNURBS_LIB_NAME) -lm -o $@
+ $(LINK) $(LINKFLAGS) example_write/example_write.o example_userdata/example_ud.o -L. -l$(OPENNURBS_LIB_NAME) -lm -luuid_mingw -lrpcrt4 -o $@
example_test/example_test : example_test/example_test.o $(OPENNURBS_LIB_FILE)
- $(LINK) $(LINKFLAGS) example_test/example_test.o -L. -l$(OPENNURBS_LIB_NAME) -lm -o $@
+ $(LINK) $(LINKFLAGS) example_test/example_test.o -L. -l$(OPENNURBS_LIB_NAME) -lm -luuid_mingw -lrpcrt4 -o $@
example_convert/example_convert : example_convert/example_convert.o example_userdata/example_ud.o $(OPENNURBS_LIB_FILE)
- $(LINK) $(LINKFLAGS) example_convert/example_convert.o example_userdata/example_ud.o -L. -l$(OPENNURBS_LIB_NAME) -lm -o $@
+ $(LINK) $(LINKFLAGS) example_convert/example_convert.o example_userdata/example_ud.o -L. -l$(OPENNURBS_LIB_NAME) -lm -luuid_mingw -lrpcrt4 -o $@
example_brep/example_brep : example_brep/example_brep.o $(OPENNURBS_LIB_FILE)
- $(LINK) $(LINKFLAGS) example_brep/example_brep.o -L. -l$(OPENNURBS_LIB_NAME) -lm -o $@
+ $(LINK) $(LINKFLAGS) example_brep/example_brep.o -L. -l$(OPENNURBS_LIB_NAME) -lm -luuid_mingw -lrpcrt4 -o $@
example_userdata/example_userdata : example_userdata/example_userdata.o $(OPENNURBS_LIB_FILE)
- $(LINK) $(LINKFLAGS) example_userdata/example_userdata.o -L. -l$(OPENNURBS_LIB_NAME) -lm -o $@
+ $(LINK) $(LINKFLAGS) example_userdata/example_userdata.o -L. -l$(OPENNURBS_LIB_NAME) -lm -luuid_mingw -lrpcrt4 -o $@
clean :
-$(RM) $(OPENNURBS_LIB_FILE)
Only in opennurbs-7.6.21127.19001.mingw: opennurbs-7.6.21127.19001.diff
diff -ur opennurbs-7.6.21127.19001/opennurbs_defines.cpp opennurbs-7.6.21127.19001.mingw/opennurbs_defines.cpp
--- opennurbs-7.6.21127.19001/opennurbs_defines.cpp 2021-05-24 10:38:07.000000000 +0900
+++ opennurbs-7.6.21127.19001.mingw/opennurbs_defines.cpp 2021-08-06 11:53:33.991438200 +0900
@@ -503,7 +503,11 @@
//fcloseall is not supported on OS X
return EOF;
#elif defined(ON_COMPILER_GNU)
+#ifdef __MINGW32__
+ return _fcloseall(); // ANSI C name
+#else
fcloseall();
+#endif
#else
// I can't find an fcloseall() or _fcloseall() in
// gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
diff -ur opennurbs-7.6.21127.19001/opennurbs_file_utilities.cpp opennurbs-7.6.21127.19001.mingw/opennurbs_file_utilities.cpp
--- opennurbs-7.6.21127.19001/opennurbs_file_utilities.cpp 2021-05-24 10:38:07.000000000 +0900
+++ opennurbs-7.6.21127.19001.mingw/opennurbs_file_utilities.cpp 2021-08-06 11:34:33.475516900 +0900
@@ -2261,7 +2261,11 @@
ON_String m_utf8_file_name_filter;
DIR* m_dir = nullptr;
struct dirent m_dirent;
+#ifdef __MINGW32__
+ char m_dirent_name_buffer[FILENAME_MAX+1]; // < this field provide storage for m_dirent.d_name[]
+#else
char m_dirent_name_buffer[NAME_MAX+1]; // < this field provide storage for m_dirent.d_name[]
+#endif
// information about the current file
wchar_t m_current_name[1024];
@@ -2521,6 +2525,7 @@
{
current_file_attributes = 0;
struct dirent* dp = 0;
+#ifndef __MINGW32__
int readdir_errno = readdir_r(m_impl->m_dir, &m_impl->m_dirent, &dp);
if ( 0 != readdir_errno )
break;
@@ -2528,6 +2533,7 @@
break;
if ( 0 == m_impl->m_dirent.d_name[0] )
break;
+#endif
if ( IsDotOrDotDotDir(m_impl->m_dirent.d_name) )
continue;
diff -ur opennurbs-7.6.21127.19001/opennurbs_gl.cpp opennurbs-7.6.21127.19001.mingw/opennurbs_gl.cpp
--- opennurbs-7.6.21127.19001/opennurbs_gl.cpp 2021-05-24 10:38:07.000000000 +0900
+++ opennurbs-7.6.21127.19001.mingw/opennurbs_gl.cpp 2021-08-07 01:28:05.000549100 +0900
@@ -16,6 +16,7 @@
#include "opennurbs.h"
#include "opennurbs_gl.h" // ON_GL() function declarations
+#include "opennurbs_material.h" // ON_GL() function declarations
void ON_GL( const int order, // ON_NurbsCurve order
const int cv_count, // ON_NurbsCurve cv count
@@ -600,7 +601,7 @@
ON_GL( pMat->Diffuse(), alpha, diffuse );
ON_GL( pMat->Specular(), alpha, specular );
ON_GL( pMat->Emission(), alpha, emission );
- GLint shine = (GLint)(128.0*(pMat->Shine() / ON_Material::MaxShine()));
+ GLint shine = (GLint)(128.0*(pMat->Shine() / ON_Material::MaxShine));
if ( shine == 0 ) {
specular[0]=specular[1]=specular[2]=(GLfloat)0.0;
}
diff -ur opennurbs-7.6.21127.19001/opennurbs_lock.h opennurbs-7.6.21127.19001.mingw/opennurbs_lock.h
--- opennurbs-7.6.21127.19001/opennurbs_lock.h 2021-05-24 10:38:07.000000000 +0900
+++ opennurbs-7.6.21127.19001.mingw/opennurbs_lock.h 2021-08-06 11:20:52.843563800 +0900
@@ -115,8 +115,12 @@
#if defined(ON_COMPILER_CLANG)
std::atomic<int> m_lock_value;
#else
+#ifdef __MINGW32__
+ std::atomic<int> m_lock_value = {ON_Lock::UnlockedValue};
+#else
std::atomic<int> m_lock_value = ON_Lock::UnlockedValue;
#endif
+#endif
#pragma ON_PRAGMA_WARNING_POP
};
diff -ur opennurbs-7.6.21127.19001/opennurbs_public_version.h opennurbs-7.6.21127.19001.mingw/opennurbs_public_version.h
--- opennurbs-7.6.21127.19001/opennurbs_public_version.h 2021-05-24 10:38:07.000000000 +0900
+++ opennurbs-7.6.21127.19001.mingw/opennurbs_public_version.h 2021-08-06 11:41:02.424272500 +0900
@@ -73,9 +73,11 @@
// At this time, verrsrc.h does not have protection against multiple includes.
// Testing for VS_FF_PRERELEASE seems to prevent double incudes and the
// redef errors it generates.
+#ifndef __MINGW32__
#include "verrsrc.h"
#endif
#endif
+#endif
#define RHINO_FILE_FLAGS_MASK VS_FF_PRERELEASE
diff -ur opennurbs-7.6.21127.19001/opennurbs_statics.cpp opennurbs-7.6.21127.19001.mingw/opennurbs_statics.cpp
--- opennurbs-7.6.21127.19001/opennurbs_statics.cpp 2021-05-24 10:38:07.000000000 +0900
+++ opennurbs-7.6.21127.19001.mingw/opennurbs_statics.cpp 2021-08-06 11:39:25.652762400 +0900
@@ -497,7 +497,11 @@
const ON_SHA1_Hash ON_SHA1_Hash::EmptyContentHash = ON_SHA1_Hash_EmptyContentHash();
const ON_SHA1_Hash ON_SHA1_Hash::ZeroDigest ON_CLANG_CONSTRUCTOR_BUG_INIT(ON_SHA1_Hash);
+#ifdef __MINGW32__
+const ONX_ModelTest ONX_ModelTest::Unset {ON_CLANG_CONSTRUCTOR_BUG_INIT(ONX_ModelTest)};
+#else
const ONX_ModelTest ONX_ModelTest::Unset ON_CLANG_CONSTRUCTOR_BUG_INIT(ONX_ModelTest);
+#endif
// Works with Microsoft's CL, fails for Apple's CLang
//// const struct ON_UnicodeErrorParameters ON_UnicodeErrorParameters::MaskErrors = { 0, 0xFFFFFFFF, ON_UnicodeCodePoint::ON_ReplacementCharacter };
@@ -713,7 +717,11 @@
const ON_LengthValue ON_LengthValue::Unset ON_CLANG_CONSTRUCTOR_BUG_INIT(ON_LengthValue);
const ON_LengthValue ON_LengthValue::Zero = ON_LengthValue::Create(0.0, ON::LengthUnitSystem::None, 0, ON_LengthValue::StringFormat::CleanDecimal);
+#ifdef __MINGW32__
+const ON_AngleValue ON_AngleValue::Unset {ON_CLANG_CONSTRUCTOR_BUG_INIT(ON_AngleValue)};
+#else
const ON_AngleValue ON_AngleValue::Unset ON_CLANG_CONSTRUCTOR_BUG_INIT(ON_AngleValue);
+#endif
const ON_AngleValue ON_AngleValue::Zero = ON_AngleValue::Create(0.0, ON::AngleUnitSystem::None, 0, ON_AngleValue::StringFormat::CleanDecimal );
const ON_ScaleValue ON_ScaleValue::Unset ON_CLANG_CONSTRUCTOR_BUG_INIT(ON_ScaleValue);
diff -ur opennurbs-7.6.21127.19001/opennurbs_system.h opennurbs-7.6.21127.19001.mingw/opennurbs_system.h
--- opennurbs-7.6.21127.19001/opennurbs_system.h 2021-05-24 10:38:07.000000000 +0900
+++ opennurbs-7.6.21127.19001.mingw/opennurbs_system.h 2021-08-06 11:28:05.427679200 +0900
@@ -22,6 +22,10 @@
////////////////////////////////////////////////////////////////
*/
+#ifdef __MINGW32__
+#define ON_NO_WINDOWS
+#endif
+
#if !defined(OPENNURBS_SYSTEM_INC_)
#define OPENNURBS_SYSTEM_INC_
diff -ur opennurbs-7.6.21127.19001/opennurbs_system_runtime.h opennurbs-7.6.21127.19001.mingw/opennurbs_system_runtime.h
--- opennurbs-7.6.21127.19001/opennurbs_system_runtime.h 2021-05-24 10:38:07.000000000 +0900
+++ opennurbs-7.6.21127.19001.mingw/opennurbs_system_runtime.h 2021-08-06 11:28:45.137120900 +0900
@@ -61,6 +61,11 @@
#endif
#endif
+
+#ifdef __MINGW32__
+#undef ON_RUNTIME_WIN
+#define ON_RUNTIME_LINUX
+#endif
/*
//
// END - ON_RUNTIME_APPLE / ON_RUNTIME_WIN / ON_RUNTIME_ANDROID defines
diff -ur opennurbs-7.6.21127.19001/opennurbs_uuid.h opennurbs-7.6.21127.19001.mingw/opennurbs_uuid.h
--- opennurbs-7.6.21127.19001/opennurbs_uuid.h 2021-05-24 10:38:07.000000000 +0900
+++ opennurbs-7.6.21127.19001.mingw/opennurbs_uuid.h 2021-08-06 11:26:23.434502300 +0900
@@ -24,9 +24,9 @@
// opennurbs.dll builds.
#define ON_UUID_DEFINED
// ON_UUID is a 16 byte universally unique identifier
- #if defined(UUID_DEFINED)
+ #if defined(UUID_DEFINED) && !defined(__MINGW32__)
typedef UUID ON_UUID;
- #elif defined(GUID_DEFINED)
+ #elif defined(GUID_DEFINED) && !defined(__MINGW32__)
typedef GUID ON_UUID;
#else
typedef struct ON_UUID_struct
'블로그 (Blog) > 개발로그 (Devlogs)' 카테고리의 다른 글
WBOIT 구현 (0) | 2024.03.08 |
---|---|
libuuid for mingw (0) | 2024.03.08 |
phong shading의 아주 좋은 예제 (0) | 2024.03.08 |
CentOS 6.5 repository 변경 (0) | 2024.03.08 |
OpenCASCADE topology (0) | 2024.03.08 |