首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为MinGW静态链接libssh

为MinGW静态链接libssh
EN

Stack Overflow用户
提问于 2020-07-15 06:40:23
回答 1查看 281关注 0票数 0

我试图将libssh静态链接到我的项目,该项目是使用mingw/mysys makefile构建的,然而,无论我如何尝试,我都会得到一大堆未定义的引用错误。我花了几个小时研究这个问题,但我仍然不能修复它。下面是我的makefile和一些示例输出。我还使用cmake编译了libssh.a文件,并将WITH_STATIC_LIB选项设置为1。即使我的链接器可以找到libssh.a文件,我也不明白如何继续得到这些错误。我是不是构建错误了?

输出示例:

代码语言:javascript
复制
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

代码语言:javascript
复制
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,但这会生成一个与.a文件具有相同问题的.lib文件

编辑:

包含LIBSSH_STATIC会导致输出如下所示:

代码语言:javascript
复制
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' 
EN

回答 1

Stack Overflow用户

发布于 2020-07-15 17:03:02

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62905022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档