簡體   English   中英

為 MinGW 靜態鏈接 libssh

[英]Linking libssh statically for MinGW

我正在嘗試將 libssh 靜態鏈接到我的項目,該項目是使用 mingw/mysys makefile 構建的,但是無論我嘗試什么,我都會得到一大堆未定義的參考錯誤。 我花了幾個小時研究這個,但我仍然無法解決它。 下面是我的 makefile 和一些示例 output。 我還使用 cmake 將 WITH_STATIC_LIB 選項設置為 1 編譯了 libssh.a 文件。即使我的 linker 可以找到 libssh.a 文件,我也不明白如何繼續出現這些錯誤。 我是不是建錯了?

示例 output:

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 為 MySys makefile 構建它,將“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 會導致 output 看起來像:

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' 

用於構建 static 庫(包括 libssh)的正確 CMake 參數是-DBUILD_SHARED_LIBS:BOOL=OFF

只要您在undefined reference to看到_imp__ ,您的 linker 就會查找從共享庫 (DLL) 導出的符號。

為確保使用 libssh 的項目查找 static 庫,您必須定義LIBSSH_STATIC ,例如通過在Makefile編譯器標志-DLIBSSH_STATIC添加到CFLAGS中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM