Ссылка на libuv. Невозможно использовать версию vsbuild.bat, собственные ссылки компиляции корректны

После успешной сборки libuv для Windows в среде mingw64 у меня возникли проблемы с связыванием libuv.dll/libuv.lib, которые создаются как часть сценария сборки vsbuild.bat.

Когда я сам собираю libuv из исходных кодов для создания .dll или .lib, я могу связать без каких-либо проблем.

Ошибки, которые я получаю при включении статической или общей библиотеки из vsbuild.bat, связаны с неопределенными ссылками, например:

[  9%] Linking CXX shared library ..\buildcmake\bin\libuws.dll
CMakeFiles\uws.dir/objects.a(Group.cpp.obj): In function `uS::Async::start(void (*)(uS::Async*))':
D:/test/uWebSockets/git/src/Libuv.h:37: undefined reference to `uv_async_init'
CMakeFiles\uws.dir/objects.a(Group.cpp.obj): In function `uS::Async::close()':
D:/test/uWebSockets/git/src/Libuv.h:45: undefined reference to `uv_close'

...и т.д

Конкретная часть моего сценария cmake, связанная со связыванием:

find_library(LIBUV_STATIC_LIBRARY NAMES libuv.lib PATHS ${LIBUV_DEPS_DIR}/git/Debug ${LIBUV_DEPS_DIR}/git/Release  PATH_SUFFIXES ${CMAKE_BUILD_TYPE}/lib NO_DEFAULT_PATH)
find_library(LIBUV_SHARED_LIBRARY NAMES libuv.dll PATHS ${LIBUV_DEPS_DIR}/git PATH_SUFFIXES .libs ${CMAKE_BUILD_TYPE} NO_DEFAULT_PATH)
MESSAGE(STATUS ".${LIBUV_STATIC_LIBRARY}")
MESSAGE(STATUS ".${LIBUV_SHARED_LIBRARY}")
include_directories(${UWS_DIR} ${LIBUVDIR_SRC} ${ZLIB_DIR_INCLUDE} ${LIBUVDIR_INCLUDE} ${OPENSSL_INCLUDE_DIR} )
add_library(uws SHARED ${UWS_SOURCES})
target_link_libraries(uws PUBLIC ${LIBUV_SHARED_LIBRARY} ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
add_definitions(-D_WIN32_WINNT=0x0A00)

Вывод cmake показывает, что библиотеки найдены в порядке...

-- .D:/test/deps/libuv/git/Debug/lib/libuv.lib
-- .D:/test/deps/libuv/git/Debug/libuv.dll

Версия CMake — 3.9.something, и я использую nu-mingw с g++.


person Tom Shaw    schedule 19.01.2018    source источник
comment
Это может быть связано с: stackoverflow.com/ вопросов/2472924/ но я не уверен, как исследовать, если это так.   -  person Tom Shaw    schedule 19.01.2018
comment
Я не пытаюсь статически связать DLL, я пытаюсь статически связать библиотеку. Предполагая, что библиотека является библиотекой импорта, как это изменит мою процедуру? Используя VS build lib/dll, независимо от того, какой метод я пытаюсь использовать, я не могу связать его с помощью dll или lib.   -  person Tom Shaw    schedule 24.01.2018
comment
Если это библиотека импорта, экспортированные символы будут иметь другую подпись из-за спецификатора класса хранения dllexport. Вам нужно будет учитывать это при извлечении заголовка библиотеки в исходном коде. Это объясняет ошибки компоновщика, которые вы получаете, если вы вытягиваете заголовок со статическими определениями, но пытаетесь связать с библиотекой импорта, экспортирующей динамические определения. Если вы нужно знать больше.   -  person ComicSansMS    schedule 25.01.2018
comment
Несколько других советов, которые я подобрал для всех, у кого есть эта проблема. Обычно импортная библиотека намного меньше, чем dll, стандартная библиотека будет такого же размера, и вы можете создать файл DEF для данной dll, в котором перечислены доступные экспортированные функции. . Если вы добавите вышеизложенное в качестве ответа, я приму это, потому что эту проблему не так легко решить.   -  person Tom Shaw    schedule 27.01.2018