#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)