Опитвам се да компилирам C++
проект, който включва C
библиотека SkelTrack който използва glib
Сега получавам цял куп от следните грешки:
LNK2019: unresolved external symbol _g_slice_alloc referenced in function _pqueue_new C:....pqueue.obj
LNK2019: unresolved external symbol _g_error_new referenced in function _skeltrack_skeleton_track_joints_sync skeltrack-skeleton.obj
LNK2019: unresolved external symbol _g_mutex_init referenced in function _skeltrack_skeleton_init skeltrack-skeleton.obj
LNK2019: unresolved external symbol _g_mutex_clear referenced in function _skeltrack_skeleton_finalize skeltrack-skeleton.obj
LNK2019: unresolved external symbol _g_mutex_lock referenced in function _skeltrack_skeleton_track_joints skeltrack-skeleton.obj
LNK2019: unresolved external symbol _g_mutex_unlock referenced in function _skeltrack_skeleton_track_joints skeltrack-skeleton.obj
LNK2019: unresolved external symbol _g_once_init_enter referenced in function _skeltrack_skeleton_get_type skeltrack-skeleton.obj
LNK2019: unresolved external symbol _g_once_init_leave referenced in function _skeltrack_skeleton_get_type skeltrack-skeleton.obj
Връзка към SkelTrack кодови референции glib
: https://github.com/joaquimrocha/Skeltrack/blob/master/skeltrack/pqueue.c#L34
Трябва да кажа, че разбирането ми за процеса на компилация - особено за Windows - е доста неясно, но има някои точки от това, което според мен е релевантна информация:
- Аз инсталирах
glib 2.36
чрез NuGet. - Неразрешените функции са в
glib
тъй като по-ранните версии; така че не мисля, че това е проблемът. - SkelTrack се компилира като
C89
защото това е това, което VS харесва най-добре. Трябваше да оправя няколко декларации, които не бяха в началото на блока. - Аз дори не включвам никаква част от SkelTrack в останалата част от проекта.
РЕДАКТИРАНЕ
- Добавих папката
C:[...]packagesglib.2.36.2.11buildnativelibv110Win32Debugdynamic
приVC++ Directories -> Library Directories
Тази папка съдържаglib-2.0.lib
.
EDIT 2
аз имам деинсталирахте NuGet glib
, изтеглени glib
за Win32 ръчно и добави include
и lib
към конфигурацията на проекта (C / C ++ Допълнителни Include и VC ++ Library Directories, съответно).
Имах всички видове синтактични грешки като:
C2143: syntax error : missing "{" before "const" c:[....]glib-devincludeglib-2.0glibgutils.h 122
Но те бяха коригирани този съвет:
В gutils.h линии 82 и 122, и в gstring.h ред 129, промяна "static inline" до "static __inline".
И сега се връщам към unresolved external
грешки.
EDIT: ОТГОВОРНОСТ?
Забравях да добавя glib-2.0.lib
, gio-2.0.lib
, и т.н.
Linker> Въвеждане> Допълнителни зависимости
Отговори:
1 за отговор № 1Имах подобна борба с Visual Studio 2015 и успях да намеря пакета NuGet; Ето какво направих:
Стъпка 1 (Предварителни условия)
- Инсталирайте пакета glib NuGet.
- Създайте директория, която да добавите
glibconfig.h
(Аз го добавихlibGlib23include
).
Стъпка 2 (свойства на проекта)
Отидете на "VC ++ Directories" в Configuration Properties и добавете следното към "Library Reference":
$(SolutionDir)packagesglib.2.36.2.11buildnativelibv110$(Platform)$(Configuration)dynamic
В "C / C ++" добавете следното към "Additional Include Directories":
$(SolutionDir)libGlib23include $(SolutionDir)packagesglib.2.36.2.11buildnativeinclude
Първият ред трябва да е мястото, където сте поставили
glibconfig.h
Сега в "Linker" добавете към "Допълнителни зависимости":
glib-2.0.lib gio-2.0.lib gmodule-2.0.lib gobject-2.0.lib gthread-2.0.lib
Трябва да сте в състояние да компилирате сега, но DLL-тата все още липсват в изходната папка, така че да не можете да стартирате програмата.
Стъпка 3 (Копиране на DLL)
В "Build Events" / "Post-Build Event" задайте командния ред на следното:
xcopy /y /d "$(SolutionDir)packagesglib.redist.2.36.2.11buildnativebinv110$(Platform)$(Configuration)dynamic*.dll" "$(OutDir)" xcopy /y /d "$(SolutionDir)packageslibintl.redist.0.18.2.10buildnativebinv110$(Platform)$(Configuration)dynamiccdecl*.dll" "$(OutDir)"
Сега би трябвало да можете да стартирате програмата си без да компилирате ръчно glib.