【问题标题】:Linking libssh statically for MinGW为 MinGW 静态链接 libssh
【发布时间】:2020-11-04 08:53:40
【问题描述】:

我正在尝试将 libssh 静态链接到我的项目,该项目是使用 mingw/mysys makefile 构建的,但是无论我尝试什么,我都会得到一大堆未定义的引用错误。我花了几个小时研究这个,但我仍然无法解决它。下面是我的 makefile 和一些示例输出。我还使用 cmake 编译了 libssh.a 文件,并将 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' 
.
.
.

生成文件

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 会导致输出如下所示:

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' 

【问题讨论】:

    标签: c++ cmake mingw libssh


    【解决方案1】:

    构建静态库(包括 libssh)的正确 CMake 参数是 -DBUILD_SHARED_LIBS:BOOL=OFF

    只要您在 undefined reference to 错误中看到 _imp__,您的链接器就会查找从共享库 (DLL) 导出的符号。

    为确保使用 libssh 的项目查找静态库,您必须定义 LIBSSH_STATIC,例如在 Makefile 中将编译器标志 -DLIBSSH_STATIC 添加到 CFLAGS

    【讨论】:

    • 之后我得到一堆看起来像这样的错误: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'
    • 看起来它仍在寻找 dllimport 符号。你确定你是用-DLIBSSH_STATIC 标志编译的吗?
    • 你可以试试这个版本libssh.org/files/0.9/libssh-0.9.4.tar.xz 吗?我对那个版本没有任何问题。
    • 是的,不幸的是我遇到了同样的问题@Brecht Sanders 但是我忘了提到在编译时我收到了这个错误:#error "Your system must have getaddrinfo()" 我通过评论该行来修复它出去。我不确定这是否是一个问题
    • 感谢您继续帮助我,但我真的很感激!
    猜你喜欢
    • 2010-10-04
    • 2017-01-06
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多