неопределенная ссылка на '__imp_fmi2_import_free'

Я пытался скомпилировать и связать тестовый файл, написанный на c, который может взаимодействовать с FMILibrary из JModelica. Я смог скомпилировать и скомпоновать его и запустить в Linux-системах. При переходе к Windows я использую компилятор mingw-64 для компиляции и компоновки тестового файла с помощью FMILibrary, но получаю неопределенные справочные ошибки. Я смог скомпилировать и запустить его на 32-битном mingw, но мне нужно скомпилировать и связать его с 64-битными скомпилированными двоичными файлами.

Моя команда выглядит так:

gcc -I <..fmilib\include> -L <..fmilib\lib> -lfmilib -o testfile testfile.c fmivars.c 

И вот результат, который распечатывается в результате

C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x9b): undefined reference to `__imp_fmi2_import_get_real'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0xd6): undefined reference to `__imp_fmi2_import_get_integer'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x111): undefined reference to `__imp_fmi2_import_get_boolean'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x14c): undefined reference to `__imp_fmi2_import_get_string'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x187): undefined reference to `__imp_fmi2_import_set_real'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x1c2): undefined reference to `__imp_fmi2_import_set_integer'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x1fd): undefined reference to `__imp_fmi2_import_set_boolean'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x238): undefined reference to `__imp_fmi2_import_set_string'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x27a): undefined reference to `__imp_fmi2_import_new_discrete_states'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x2b6): undefined reference to `__imp_fmi2_import_collect_model_counts'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x30b): undefined reference to `__imp_fmi2_status_to_string'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x37e): undefined reference to `__imp_jm_vsnprintf'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x395): undefined reference to `__imp_fmi2_status_to_string'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x437): undefined reference to `__imp_jm_vsnprintf'
C:\Users\....\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x556): undefined reference to `__imp_fmi2_import_get_version'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x575): undefined reference to `__imp_fmi2_import_get_types_platform'
C:\Users\....\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x594): undefined reference to `__imp_fmi2_import_get_number_of_continuous_states'
C:\Users\...\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x5a8): undefined reference to `__imp_fmi2_import_get_number_of_event_indicators'
C:\Users\....\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x64a): undefined reference to `__imp_fmi2_import_instantiate'
C:\Users\....\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x690): undefined reference to `__imp_fmi2_import_set_debug_logging'
C:\Users\....\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x6af): undefined reference to `__imp_fmi2_status_to_string'
C:\Users\....\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x6df): undefined reference to `__imp_fmi2_import_set_debug_logging'
C:\Users\....\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x718): undefined reference to `__imp_fmi2_import_setup_experiment'
C:\Users\....\AppData\Local\Temp\ccFR53Q1.o:testfile.c:(.text+0x733): undefined reference to `__imp_fmi2_import_enter_initialization_mode'

Есть ли какой-либо макрос или что-либо, установленное в FMILibrary для компиляции с 64-битным компилятором mingw на 64-битных окнах? Спасибо.


person lorugant    schedule 01.02.2019    source источник
comment
Является ли fmilib статической библиотекой или dll? Также вы проверили, что ваша библиотека или dll 64-битная? (вы можете использовать Dependency Walker)   -  person PilouPili    schedule 01.02.2019
comment
Итак, я собрал библиотеку, используя 64-битный компилятор mingw, и в пути есть .dll , .a и .dll.a. Но я пытаюсь связать его статически.   -  person lorugant    schedule 01.02.2019
comment
@PilouPili Я попробовал обходчик зависимостей, но он говорит, что точка входа не привязана и показывает красный PI. Я не уверен, что это должно означать. А еще я получаю кучу ошибок.   -  person lorugant    schedule 05.02.2019


Ответы (2)


Предполагая, что библиотека libfmilib.x.y.z предоставила отсутствующие символы, затем в командной строке компоновщика/компилятора переместите ее справа от .c-файлов, требующих их

gcc -I <..fmilib\include> -L <..fmilib\lib> -o testfile testfile.c fmivars.c -lfmilib 
person alk    schedule 02.02.2019
comment
Точно такое же поведение? - person alk; 04.02.2019
comment
да @alk Как вы думаете, это может быть из-за того, что библиотека не поддерживает 64-битную версию? Как вы думаете, может ли это быть так? - person lorugant; 04.02.2019

Спасибо всем за помощь. Наконец-то я решил свою проблему и смог запустить код. Я установил обходчик зависимостей, как было предложено @PilouPili, и обнаружил, что мое приложение ищет библиотеку в той же папке (по какой-то причине я не знаю), и не смог ее найти. Итак, я скопировал все статические и динамические библиотеки и вставил в папку, где находится мой тестовый файл. Также я изменил командную строку, как предложил @alk, и переместил -lfmilib в конец. И я использовал динамическую библиотеку вместо статической. Но в любом случае мое приложение работает сейчас. Большое спасибо за помощь.

person lorugant    schedule 05.02.2019