问题描述
我正在尝试编译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,而是从他们的网站下载了二进制文件frmo。二进制文件的名称为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 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 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
解决方法
我是否必须将所有链接都链接到编译器,以便程序进行编译?
OCCT是一个框架,它由分为模块的工具包(库)组成。可以链接到整个OCCT框架(所有库),但是在这种情况下,未使用的库将成为无用的负担。相反,最好仅链接和发布应用程序实际使用的工具箱及其嵌套依赖项。
链接和编译是构建过程的两个不同步骤,因此:
- 您需要通过 -I 参数将头文件的位置传递给 compiler ,该参数通常是一个 inc 文件夹,其中包含所有公共的头文件OCCT课程。自定义版本中可能会有所不同。
- 您需要通过 -L 参数将导入库的位置传递给 linker ,对于Release和 win64 / vc14 / lib em> win64 / vc14 / libd 用于库的调试版本,其中 win64 表示平台(64位Windows),而 vc14 表示编译器(Visual Studio 2015) ;对于MinGW,它将是 gcc 而不是 vc14 。
- 您需要通过 -l 参数将导入库的名称传递给 linker (或者,跳过 -L 参数)。
- 类似的文件夹 win64 / vc14 / bin 和 win64 / vc14 / bind 包含启动应用程序所需的DLL库文件。必需的DLL应该复制到应用程序文件夹中,或放入Windows中的%PATH%环境变量中。
用于构建OCCT的编译器和配置应与用于构建应用程序本身的配置匹配。例如。您不能使用Visual Studio构建的OCCT来使用MinGW构建应用程序-它们使用C ++内部构件的二进制不兼容格式。
注意:在Windows平台上,链接到不解析应用程序中任何符号的库是无操作的-额外的DLL不会放入启动应用程序所需的应用程序依赖项中。这在其他平台(Linux / UNIX)上是不同的,在这些平台上,即使未实际使用链接库,也会将它们置于依赖关系中。
在不研究OCCT框架结构的情况下,弄清楚应用程序所需的库可能很棘手。以下提示可能会有所帮助:
-
确定所需库的第一步是检查项目使用的OCCT类的位置。这可以通过两种方式完成:
- 在生成的Doxygen documentation中查找类(例如 STEPControl_Reader ),然后从路径中清除工具包,例如“ Module DataExchange-> Toolkit TKSTEP-> Package STEPControl”。 TKSTEP 是您需要链接的库名称(例如 -lTKSTEP )。
- 在OCCT源代码中,grep src 文件夹中名为 PACKAGES 的所有文件,以获取所需的程序包名称(可以从类名称 STEPControl_Reader 轻松分解>-> STEPControl 是一个软件包)。在这种情况下,您会在文件 src / TKSTEP / PACKAGES 中找到包 STEPControl ,文件夹名称为 TKSTEP 将是您需要链接的工具箱/库名称。
-
在下一步中,您需要确定隐式使用该应用程序的其他OCCT Toolkit。例如,大多数OCCT类都会继承 TKernel 库中定义的 Standard_Transient 类。尝试构建应用程序并检查链接器错误-它们应包含OCCT框架中类方法的路径。推断类名称->程序包名称,并重复第一步以确定Toolkit名称。
-
作为步骤2的快捷替代方法,请查看Doxygen documentation内或 src / ToolkitName / EXTERNLIB 中已经推导的OCCT工具包的依赖关系图。 em>文件。
-
最后,您可能需要链接和复制OCCT本身使用的第三方库,例如FreeType,FreeImage等。该列表将取决于在构建OCCT本身时启用的OCCT组件和启用的第三方(大多数是可选的)。