Я пытаюсь скомпилировать программу OpenCascade.
Вот ссылка на программу: https://www.opencascade.com/content/unable-convert-step-file-stl-file (это ошибочная программа, но это начало)
Я должен связать все библиотеки, пути к библиотекам и включить пути к gcc (флаги -L, -l, -I). У меня установлен OpenCascade, и вот папка установки.
Большинство из этих папок, которые вы видите, имеют папки bin, include и lib.
Должен ли я связать их все с компилятором, чтобы программа скомпилировалась?
Это единственные включения, которые использует программа:
#include "STEPControl_Reader.hxx"
#include <TopoDS_Shape.hxx>
#include <StlAPI_Writer.hxx>
РЕДАКТИРОВАТЬ: «TopoDS_Shape.hxx
» и «StAPI_Writer.hxx
» расположены по этому пути C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc
.
'STEPControl_Reader.hxx
' также существует в том же каталоге, я не знаю, почему первоначальный автор поместил его в свой локальный каталог.
РЕДАКТИРОВАТЬ 2: я также прочитал эту ветку форума: https://forum.freecadweb.org/viewtopic.php?t=15993 но мне это совсем не помогло. Он использует Linux, и структура каталогов include и lib не одинакова.
РЕДАКТИРОВАНИЕ ПОСЛЕ ПОПЫТКИ КОМПИЛЯЦИИ:
Я поставил
win64\vc14\bin
в%PATH%
Я понял часть
-I
, так как все три заголовочных файла находятся в одном каталоге. (C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc
)Для расположения импортных библиотек я использовал
C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\win64\vc14\lib
. Думаю, мне не нужно переименовывать его в gcc\lib, верно? Я не собирал OCCT сам, я скачал бинарник с их сайта. Имя двоичного файла былоopencascade-7.4.0-vc14-64
. Я так понимаю я в порядке? Хотя я использую gcc.Я выяснил название библиотек для трех заголовочных файлов из онлайн-документа.
STEPControl_Reader
используетTKSTEP
,TopoDS_Shape
используетTKBRep
,StlAPI_Writer
используетTKSTL
.
Поэтому я дал эту команду:
gcc -I C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc -L C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\win64\vc14\lib -l TKSTEP -l TKBRep -l TKSTL testCode.c
Вот что я получил:
In file included from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_Integer.hxx:18,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_Address.hxx:18,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d.hxx:21,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/STEPCon
trol_Reader.hxx:20,
from testCode.c:2:
C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standard_Std.hxx:20:10: fatal
error: type_traits: No such file or directory
#include <type_traits>
^~~~~~~~~~~~~
compilation terminated.
КОМПИЛЯЦИОННЫЙ ЭКСПЕРИМЕНТ 2:
C:\Users\User1\Desktop\OPENCAS>g++ -I C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7
.4.0\inc -L C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\win64\vc14\lib -l TKS
TEP -l TKBRep -l TKSTL testCode.cpp
testCode.cpp: In function 'Standard_Integer main(int, char**)':
testCode.cpp:26:3: error: 'cout' was not declared in this scope
cout << argv[2] << endl;
^~~~
testCode.cpp:26:3: note: suggested alternative:
In file included from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_Stream.hxx:20,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_OStream.hxx:19,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_ExtCharacter.hxx:28,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_PrimitiveTypes.hxx:27,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_Transient.hxx:20,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d.hxx:91,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/STEPCon
trol_Reader.hxx:20,
from testCode.cpp:2:
C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86
_64-w64-mingw32/8.1.0/include/c++/iostream:61:18: note: 'std::cout'
extern ostream cout; /// Linked to standard output
^~~~
testCode.cpp:26:22: error: 'endl' was not declared in this scope
cout << argv[2] << endl;
^~~~
testCode.cpp:26:22: note: suggested alternative:
In file included from C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-re
v0/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/iostream:39,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_Stream.hxx:20,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_OStream.hxx:19,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_ExtCharacter.hxx:28,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_PrimitiveTypes.hxx:27,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d_Transient.hxx:20,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/Standar
d.hxx:91,
from C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\inc/STEPCon
trol_Reader.hxx:20,
from testCode.cpp:2:
C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/lib/gcc/x86
_64-w64-mingw32/8.1.0/include/c++/ostream:590:5: note: 'std::endl'
endl(basic_ostream<_CharT, _Traits>& __os)
КОМПИЛЯЦИОННЫЙ ЭКСПЕРИМЕНТ 3 (после замены cout
и endl
на std::cout
и std::endl
)
C:\Users\User1\Desktop\OPENCAS>g++ -I C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7
.4.0\inc -L C:\OpenCASCADE-7.4.0-vc14-64\opencascade-7.4.0\win64\vc14\lib -l TKS
TEP -l TKBRep -l TKSTL testCode.cpp
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text+0x27): undefine
d reference to `STEPControl_Reader::STEPControl_Reader()'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text+0x3a): undefine
d reference to `XSControl_Reader::ReadFile(char const*)'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text+0x49): undefine
d reference to `STEPControl_Reader::NbRootsForTransfer()'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text+0x58): undefine
d reference to `XSControl_Reader::TransferRoots()'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text+0x6b): undefine
d reference to `XSControl_Reader::OneShape() const'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text+0x77): undefine
d reference to `StlAPI_Writer::StlAPI_Writer()'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text+0xa0): undefine
d reference to `StlAPI_Writer::Write(TopoDS_Shape const&, char const*)'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text$_ZN24NCollectio
n_BaseSequencedlEPv[_ZN24NCollection_BaseSequencedlEPv]+0x11): undefined referen
ce to `Standard::Free(void*)'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
e6handleI25NCollection_BaseAllocatorE8EndScopeEv[_ZN11opencascade6handleI25NColl
ection_BaseAllocatorE8EndScopeEv]+0x23): undefined reference to `Standard_Transi
ent::DecrementRefCounter() const'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
e6handleI30TopLoc_SListNodeOfItemLocationE8EndScopeEv[_ZN11opencascade6handleI30
TopLoc_SListNodeOfItemLocationE8EndScopeEv]+0x23): undefined reference to `Stand
ard_Transient::DecrementRefCounter() const'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
e6handleI13TopoDS_TShapeE8EndScopeEv[_ZN11opencascade6handleI13TopoDS_TShapeE8En
dScopeEv]+0x23): undefined reference to `Standard_Transient::DecrementRefCounter
() const'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text$_ZN20NCollectio
n_SequenceIN11opencascade6handleI18Standard_TransientEEE5ClearERKNS1_I25NCollect
ion_BaseAllocatorEE[_ZN20NCollection_SequenceIN11opencascade6handleI18Standard_T
ransientEEE5ClearERKNS1_I25NCollection_BaseAllocatorEE]+0x1f): undefined referen
ce to `NCollection_BaseSequence::ClearSeq(void (*)(NCollection_SeqNode*, opencas
cade::handle<NCollection_BaseAllocator>&))'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
e6handleI21XSControl_WorkSessionE8EndScopeEv[_ZN11opencascade6handleI21XSControl
_WorkSessionE8EndScopeEv]+0x23): undefined reference to `Standard_Transient::Dec
rementRefCounter() const'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text$_ZN20NCollectio
n_SequenceI12TopoDS_ShapeE5ClearERKN11opencascade6handleI25NCollection_BaseAlloc
atorEE[_ZN20NCollection_SequenceI12TopoDS_ShapeE5ClearERKN11opencascade6handleI2
5NCollection_BaseAllocatorEE]+0x1f): undefined reference to `NCollection_BaseSeq
uence::ClearSeq(void (*)(NCollection_SeqNode*, opencascade::handle<NCollection_B
aseAllocator>&))'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
e6handleI25NCollection_BaseAllocatorE10BeginScopeEv[_ZN11opencascade6handleI25NC
ollection_BaseAllocatorE10BeginScopeEv]+0x23): undefined reference to `Standard_
Transient::IncrementRefCounter() const'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
e6handleI18Standard_TransientE8EndScopeEv[_ZN11opencascade6handleI18Standard_Tra
nsientE8EndScopeEv]+0x23): undefined reference to `Standard_Transient::Decrement
RefCounter() const'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.rdata$.refptr._ZTV18
STEPControl_Reader[.refptr._ZTV18STEPControl_Reader]+0x0): undefined reference t
o `vtable for STEPControl_Reader'
C:\Users\User1\AppData\Local\Temp\ccCCS9c3.o:testCode.cpp:(.rdata$.refptr._ZTV16
XSControl_Reader[.refptr._ZTV16XSControl_Reader]+0x0): undefined reference to `v
table for XSControl_Reader'
collect2.exe: error: ld returned 1 exit status
gcc ... testCode.c
. Вы не можете построить код C++ с помощью компилятора C - переименуйте исходный файл в.cpp
или.cxx
и вместо этого используйте компиляторg++
. - person gkv311   schedule 19.08.2020cout
/endl
использовать в коде приложения паруstd::cout
/std::endl
. - person gkv311   schedule 19.08.2020