Статическое связывание libssh для MinGW

Я пытаюсь статически связать libssh с моим проектом, созданным с использованием make-файла mingw/mysys, однако независимо от того, что я пытаюсь сделать, я получаю целую кучу ошибок неопределенных ссылок. Я потратил часы на изучение этого, но я все еще не могу это исправить. Ниже приведен мой make-файл и несколько примеров вывода. Я также скомпилировал файл libssh.a с помощью cmake с параметром WITH_STATIC_LIB, установленным на 1. Я не понимаю, как я могу продолжать получать эти ошибки, даже если мой компоновщик может найти файл libssh.a. Я неправильно построил?

Пример вывода:

c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: build/BMU.o: in function `ZN3ssh7SessionC1Ev':
./include/libssh/libsshpp.hpp:130: undefined reference to `_imp__ssh_new' 
.
.
.

Makefile

CC          := g++
TARGET      := "dist/target"
BUILDDIR    := build
SRCDIR      := src
CFLAGS      := -std=c++17 -g  -mconsole 
SRCEXT      := cpp
SOURCES     := $(wildcard $(SRCDIR)/*.$(SRCEXT))
OBJECTS     := $(patsubst $(SRCDIR)/%, $(BUILDDIR)/%, $(SOURCES:.$(SRCEXT)=.o))
INCLUDE     := -I./include
LIB         := -L./lib -lws2_32 -lssh -lmodbus -static

$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
    @printf "\e[33m\e[1mBuilding...\e[0m\n";
    @mkdir -p $(BUILDDIR)
    @echo "  $(notdir $@) from $(notdir $<)"
    @$(CC) $(CFLAGS) $(INCLUDE) -c -o $@ $<

$(TARGET): $(OBJECTS)
    @printf "\e[35m\e[1mLinking...\e[0m\n";
    @mkdir -p dist
    @echo "  $(notdir $(OBJECTS))"
    @$(CC) $(CFLAGS) -o $@ $^ $(LIB)

Сборка Libssh:

Сначала я сделал git clone https://git.libssh.org/projects/libssh.git libssh

затем с помощью cmake-gui создал его для make-файла MySys с параметром «WITH_STATIC_LIB», установленным на «ON», и «WITH_SHARED_LIB» на «OFF».

Затем я запустил make со своего терминала, и он создал файл libssh.a, который я переместил в папку ./lib в моем проекте.

Файл make смог найти файл libssh.a, но я все еще получаю эти ошибки.

Любая помощь приветствуется, и да, я просмотрел множество других сообщений stackoverflow, прежде чем опубликовать себя.

Другие вещи, которые я пробовал

#define LIBSSH_STATIC 1 и без него

используя vcpkg для установки libssh, но это создает файл .lib, который имеет те же проблемы, что и файл .a

Редактировать:

Включение LIBSSH_STATIC приводит к тому, что вывод выглядит так:

c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: ./lib\libssh.a(channels.c.obj):channels.c:(.text+0x1979): undefined reference to `_imp__ssh_buffer_add_data' 

person Owen Kuhn    schedule 14.07.2020    source источник


Ответы (1)


Правильный параметр CMake для сборки статических библиотек (в том числе и для libssh) — -DBUILD_SHARED_LIBS:BOOL=OFF

Пока вы видите _imp__ в ошибках undefined reference to, ваш компоновщик ищет символы, экспортированные из общей библиотеки (DLL).

Чтобы убедиться, что проект, использующий libssh, ищет статическую библиотеку, вы должны определить LIBSSH_STATIC, например, добавив флаг компилятора -DLIBSSH_STATIC в CFLAGS в файле Makefile.

person Brecht Sanders    schedule 15.07.2020
comment
После этого я получаю кучу ошибок, которые выглядят так: c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ ld.exe: ./lib\libssh.a(channels.c.obj):channels.c:(.text+0x1979): неопределенная ссылка на `_imp__ssh_buffer_add_data' - person Owen Kuhn; 15.07.2020
comment
Похоже, он все еще ищет символы dllimport. Вы уверены, что скомпилировали с флагом -DLIBSSH_STATIC? - person Brecht Sanders; 16.07.2020
comment
Можете ли вы попробовать эту версию libssh.org/files/0.9/ libssh-0.9.4.tar.xz ? У меня нет проблем с этой версией. - person Brecht Sanders; 16.07.2020
comment
Да, к сожалению, у меня такая же проблема @Brecht Sanders Однако я забыл упомянуть, что при компиляции я получаю эту ошибку: #error Ваша система должна иметь getaddrinfo(), которую я исправил, просто закомментировав эту строку. Я не уверен, если это проблема или нет - person Owen Kuhn; 16.07.2020
comment
Спасибо, что продолжаете помогать мне, хотя я очень ценю это! - person Owen Kuhn; 16.07.2020