[英]Linking libssh statically for MinGW
我正在嘗試將 libssh 靜態鏈接到我的項目,該項目是使用 mingw/mysys makefile 構建的,但是無論我嘗試什么,我都會得到一大堆未定義的參考錯誤。 我花了幾個小時研究這個,但我仍然無法解決它。 下面是我的 makefile 和一些示例 output。 我還使用 cmake 將 WITH_STATIC_LIB 選項設置為 1 編譯了 libssh.a 文件。即使我的 linker 可以找到 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'
.
.
.
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)
首先我做了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.