我试图将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'
.
.
.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,但这会生成一个与.a文件具有相同问题的.lib文件
编辑:
包含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' 发布于 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。
https://stackoverflow.com/questions/62905022
复制相似问题