Компиляция программы и компоновка всех библиотек и путей включения

#gcc #compilation #include-path #lib #opencascade

#gcc #Сборник #включить-path #библиотека #opencascade

Вопрос:

Я пытаюсь скомпилировать программу 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-64opencascade-7.4.0inc .

STEPControl_Reader.hxx ‘ также существует в том же каталоге, я не знаю, почему первоначальный автор поместил его в свой локальный каталог.

ПРАВКА 2: я также прочитал эту ветку форума: https://forum.freecadweb.org/viewtopic.php?t=15993 но мне это совсем не помогло. Он использует Linux, и структура каталогов include и lib отличается.

РЕДАКТИРОВАТЬ ПОСЛЕ ПОПЫТКИ КОМПИЛЯЦИИ:

  • Я вставил win64vc14bin в %PATH%

  • Я разобрался с -I частью, поскольку все три файла заголовков находятся в одном каталоге. ( C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc )

  • Для расположения библиотек импорта я использовал C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0win64vc14lib . Полагаю, мне не нужно переименовывать его в 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-64opencascade-7.4.0inc -L C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0win64vc14lib -l TKSTEP -l TKBRep -l TKSTL testCode.c
  

Это то, что я получил:

 In file included from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d_Integer.hxx:18,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d_Address.hxx:18,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d.hxx:21,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/STEPCon
trol_Reader.hxx:20,
                 from testCode.c:2:
C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standard_Std.hxx:20:10: fatal
 error: type_traits: No such file or directory
 #include <type_traits>
          ^~~~~~~~~~~~~
compilation terminated.
  

COMPILATION EXPERIMENT 2:

 C:UsersUser1DesktopOPENCAS>g   -I C:OpenCASCADE-7.4.0-vc14-64opencascade-7
.4.0inc -L C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0win64vc14lib -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-64opencascade-7.4.0inc/Standar
d_Stream.hxx:20,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d_OStream.hxx:19,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d_ExtCharacter.hxx:28,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d_PrimitiveTypes.hxx:27,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d_Transient.hxx:20,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d.hxx:91,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/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-64opencascade-7.4.0inc/Standar
d_Stream.hxx:20,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d_OStream.hxx:19,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d_ExtCharacter.hxx:28,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d_PrimitiveTypes.hxx:27,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d_Transient.hxx:20,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/Standar
d.hxx:91,
                 from C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0inc/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>amp; __os)
  

ЭКСПЕРИМЕНТ ПО КОМПИЛЯЦИИ 3 (после изменения cout и endl на std::cout и std::endl )

   C:UsersUser1DesktopOPENCAS>g   -I C:OpenCASCADE-7.4.0-vc14-64opencascade-7
    .4.0inc -L C:OpenCASCADE-7.4.0-vc14-64opencascade-7.4.0win64vc14lib -l TKS
    TEP -l TKBRep -l TKSTL testCode.cpp
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text 0x27): undefine
    d reference to `STEPControl_Reader::STEPControl_Reader()'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text 0x3a): undefine
    d reference to `XSControl_Reader::ReadFile(char const*)'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text 0x49): undefine
    d reference to `STEPControl_Reader::NbRootsForTransfer()'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text 0x58): undefine
    d reference to `XSControl_Reader::TransferRoots()'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text 0x6b): undefine
    d reference to `XSControl_Reader::OneShape() const'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text 0x77): undefine
    d reference to `StlAPI_Writer::StlAPI_Writer()'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text 0xa0): undefine
    d reference to `StlAPI_Writer::Write(TopoDS_Shape constamp;, char const*)'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text$_ZN24NCollectio
    n_BaseSequencedlEPv[_ZN24NCollection_BaseSequencedlEPv] 0x11): undefined referen
    ce to `Standard::Free(void*)'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
    e6handleI25NCollection_BaseAllocatorE8EndScopeEv[_ZN11opencascade6handleI25NColl
    ection_BaseAllocatorE8EndScopeEv] 0x23): undefined reference to `Standard_Transi
    ent::DecrementRefCounter() const'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
    e6handleI30TopLoc_SListNodeOfItemLocationE8EndScopeEv[_ZN11opencascade6handleI30
    TopLoc_SListNodeOfItemLocationE8EndScopeEv] 0x23): undefined reference to `Stand
    ard_Transient::DecrementRefCounter() const'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
    e6handleI13TopoDS_TShapeE8EndScopeEv[_ZN11opencascade6handleI13TopoDS_TShapeE8En
    dScopeEv] 0x23): undefined reference to `Standard_Transient::DecrementRefCounter
    () const'
    C:UsersUser1AppDataLocalTempccCCS9c3.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>amp;))'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
    e6handleI21XSControl_WorkSessionE8EndScopeEv[_ZN11opencascade6handleI21XSControl
    _WorkSessionE8EndScopeEv] 0x23): undefined reference to `Standard_Transient::Dec
    rementRefCounter() const'
    C:UsersUser1AppDataLocalTempccCCS9c3.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>amp;))'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
    e6handleI25NCollection_BaseAllocatorE10BeginScopeEv[_ZN11opencascade6handleI25NC
    ollection_BaseAllocatorE10BeginScopeEv] 0x23): undefined reference to `Standard_
    Transient::IncrementRefCounter() const'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.text$_ZN11opencascad
    e6handleI18Standard_TransientE8EndScopeEv[_ZN11opencascade6handleI18Standard_Tra
    nsientE8EndScopeEv] 0x23): undefined reference to `Standard_Transient::Decrement
    RefCounter() const'
    C:UsersUser1AppDataLocalTempccCCS9c3.o:testCode.cpp:(.rdata$.refptr._ZTV18
    STEPControl_Reader[.refptr._ZTV18STEPControl_Reader] 0x0): undefined reference t
    o `vtable for STEPControl_Reader'
    C:UsersUser1AppDataLocalTempccCCS9c3.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
  

Комментарии:

1. Проверьте инструкции по использованию вашей установки MinGW (TDM, MSYS2, я не знаю) — компилятор не нашел свои собственные заголовки C .

2. Я не понял, что вы сказали. Где такие инструкции?

3. Пожалуйста, расскажите, каково происхождение компилятора gcc в вашей системе в первую очередь — есть много вариантов в случае Windows.

4. Честно говоря, я не знаю. У меня был gcc в течение многих лет, возможно, через Cygwin. Затем я попытался создать OCE, поэтому я установил MinGW, MSYS2 .. Так что я не знаю, что сказать. Вы имеете в виду, что я набираю gcc —version? Это то, о чем вы спрашиваете?

5. Cygwin, MinGW, MinGW-w64, MSYS2 (включает MinGW-w64) — это очень разные варианты создания проектов с использованием GCC на платформе Windows — так что да, вы должны сообщить, что вы на самом деле используете (с версией), чтобы получить некоторую помощь, MinGW устарел и не может использоваться для создания современных проектов (MinGW-w64 более поздний), Cygwin очень специфичен.

Ответ №1:

Должен ли я связать их все с компилятором, чтобы программа скомпилировалась?

OCCT — это фреймворк, он состоит из наборов инструментов (библиотек), сгруппированных в модули. Возможно создание ссылок на весь фреймворк OCCT (все библиотеки), но в этом случае неиспользуемые библиотеки станут бесполезным бременем. Вместо этого предпочтительнее создавать ссылки и отправлять только те наборы инструментов, которые действительно использует приложение, а также их вложенные зависимости.

Компоновка и компиляция — это два разных этапа процесса сборки, так что:

  • Вам нужно передать местоположение файлов заголовков компилятору через аргумент -I, который обычно представляет собой папку inc, содержащую все файлы заголовков общедоступных классов OCCT. В пользовательских сборках это может отличаться.
  • Вам нужно передать местоположение импортируемых библиотек в компоновщик через аргумент -L, который обычно является win64 /vc14/lib для выпуска и win64 / vc14 / libd для отладочной версии библиотек, где win64 указывает платформу (64-разрядная Windows), а vc14 указывает компилятор (Visual Studio 2015); в случае MinGW это будет gcc вместо vc14.
  • Вам нужно передать имена импортируемых библиотек в компоновщик через аргумент -l (альтернативно, это может быть полный путь к каждой библиотеке, чтобы пропустить аргумент -L).
  • Похожие папки win64/vc14/bin и win64/vc14/bind содержат файлы библиотеки DLL, необходимые для запуска приложения. Необходимые библиотеки DLL следует либо скопировать в папку приложения, либо поместить в переменную окружения %PATH% в Windows.

Компилятор и конфигурация, используемые для построения OCCT, должны соответствовать конфигурации для построения самого приложения. Например. вы не можете использовать OCCT, созданный Visual Studio, для построения приложения с использованием MinGW — они используют двоичные несовместимые форматы внутренних компонентов C .

Примечание: на платформе Windows ссылка на библиотеку, не разрешающую никаких символов в приложении, является необязательной — дополнительная библиотека DLL не будет помещена в зависимости приложения, необходимые для запуска приложения. Это отличается на других платформах (Linux / UNIX), где связанная библиотека будет поставлена в зависимость, даже если она фактически не используется.

Выяснить, какие библиотеки необходимы вашему приложению, может быть сложно без изучения структуры OCCT framework. Следующие советы могут быть полезны:

  1. Первым шагом для определения необходимых вам библиотек является проверка места нахождения классов OCCT, используемых вашим проектом. Это можно сделать двумя способами:

    • Найдите классы (например, STEPControl_Reader) в сгенерированной документации Doxygen и удалите инструментарий из пути к классу, например «Module DataExchange -> Toolkit TKTEP -> Package STEPControl». TKTEP — это имя библиотеки, которое вам нужно будет связать (например, -lTKSTEP). Класс STEPControl_Reader в OCCT Doxygen
    • В исходном коде OCCT grep все файлы с именами PACKAGES в папке src для требуемого имени пакета (которое можно легко разложить по имени класса STEPControl_Reader -> STEPControl — это пакет). В этом конкретном случае вы найдете пакет STEPControl в файле src/TKTEP/PACKAGES, а имя папки TKTSTEP будет именем инструментария / библиотеки, на которую вам нужно создать ссылку.
  2. На следующем шаге вам нужно будет определить другие наборы инструментов OCCT, которые приложение использует неявно. Например, большинство классов OCCT наследуют класс Standard_Transient, который определен в библиотеке TKernel. Попробуйте создать свое приложение и проверьте ошибки компоновщика — они должны содержать пути к методам класса из OCCT framework. Выведите имена классов -> Имена пакетов и повторите первый шаг, чтобы определить имя инструментария.

  3. В качестве сокращенной альтернативы шагу 2, взгляните на график зависимостей уже выведенных наборов инструментов OCCT в документации Doxygen или в файле src /ToolkitName / EXTERNLIB. Зависимости TKSTEP в OCCT Doxygen

  4. Наконец, вам может потребоваться связать и скопировать сторонние библиотеки, используемые самим OCCT, такие как FreeType, FreeImage и другие. Список будет зависеть от используемых компонентов OCCT и сторонних разработчиков, включенных при сборке самого OCCT (большинство из них являются необязательными).

Комментарии:

1. Спасибо. Я попробовал компиляцию, но это не удалось. Я не могу понять сообщение об ошибке.