Как скомпилировать / связать сгенерированный C-код из Simulink

#c #gcc #shared-libraries #code-generation #simulink

#c #gcc #общие библиотеки #генерация кода #simulink

Вопрос:

У меня есть сгенерированный zip-файл, который содержит сгенерированный C-код из модели Simulink. Цель состоит в том, чтобы скомпилировать этот код в общей библиотеке, которую я могу использовать из серверной части .NET Core.

Я должен скомпилировать его как для Windows, так и для Unix-систем, потому что большинство разработчиков используют Windows, в то время как сервер работает на Unix (и я сам работаю на osx).

ZIP-файл имеет следующую структуру:

     optimizationModel_grt_rtw
    R2019b
       extern/include
       rtw/c/src/
       simulink/include 
  

У меня также есть «скрипт», который использует модель внутри _grt_rtw папки.
«Скрипт» содержит одну функцию, которая использует модель.

Кажется, я могу успешно скомпилировать его следующим образом:

     gcc -I ./optimlib/R2019b/extern/include/ 
    -I ./optimlib/R2019b/simulink/include/ 
    -I ./optimlib/optimizationModel4_grt_rtw/ 
    -I ./optimlib/R2019b/rtw/c/src/ 
    -c -fpic src/optimumCalc.c 
    -o out/optimumCalc.o
  

Но когда я пытаюсь связать, я получаю целую кучу ошибок неиспользуемых ссылок для архитектуры x86_64. Я почти уверен, что в коде есть все.

Журналы Ошибок:

 Undefined symbols for architecture x86_64:
  "_optimizationModel4_B", referenced from:
      _calcOptimum in optimumCalc.o
  "_optimizationModel4_U", referenced from:
      _calcOptimum in optimumCalc.o
  "_optimizationModel4_Y", referenced from:
      _calcOptimum in optimumCalc.o
  "_optimizationModel4_initialize", referenced from:
      _calcOptimum in optimumCalc.o
  "_optimizationModel4_step", referenced from:
      _calcOptimum in optimumCalc.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
  

Команда компоновщика, которую я использую, следующая:
gcc -dynamiclib out/optimumCalc.o -o out/optimlib.dylib

Я предполагаю, что есть что-то, чего мне не хватает в команде компоновщика, но я не могу понять это. Я также попытался передать параметры -I, которые я передал с первой командой.

Я действительно не могу найти никакой документации о том, как скомпилировать это с использованием gcc в системах, в которых не установлены среды MATLAB / Simulink. Если кто-нибудь может указать мне правильное направление или посмотреть, чего мне не хватает в команде компоновщика?

Спасибо!

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

1. «Я получаю целую кучу ошибок». Вероятно, было бы полезно узнать, что это за ошибки.

2. Я могу добавить точный журнал, который я получаю, но вы все равно ничего не поймете, не взглянув на исходный код (который, кстати, является частным исходным кодом). «неиспользуемые ошибки ссылок» — это все, что я могу вам дать. Журналы все равно добавлены. @GuillaumePetitjean

3. в вставленном вами журнале ошибок упоминается, undefined symbols errors что означает, что там должно быть что-то (например _optimizationModel4_B ), но это не так. проверьте код и убедитесь, что _optimizationModel4_B действительно существует, а затем добавьте этот файл в свои includes или реорганизуйте код.

4. @JC97 Не совсем понимаю ваш последний комментарий: Shark предложил довольно логичное объяснение, но вы не хотите ему следовать? Символ не найден. вы проверили, где определен и объявлен этот символ? Включен ли исходный файл, в котором он определен, в make? Включен ли путь к заголовочному файлу, в котором он объявлен, в make?

5. Да, я имел в виду, что я проверил каждую ссылку, указанную в журнале, и дважды проверил, что все было в исходном коде. Итак, я сделал это перед публикацией вопроса. Я также спросил парня с более чем 15-летним опытом работы на C / C , но у него не так много времени. Он был почти уверен, что это как-то связано с командой компоновщика, поскольку код в порядке. Не используя makefile, просто обычная команда gcc. Возможно, в вопросе было неясно (моя ошибка), но мне просто показалось, что вы предполагали, что я ничего не проверял, прежде чем публиковать вопрос здесь, сразу проголосовав против. (1/2)