gpt4 book ai didi

c++ - cygwin g++ 链接器找不到共享库

转载 作者:可可西里 更新时间:2023-11-01 16:31:12 25 4
gpt4 key购买 nike

我一直在创建一个库。当我将它编译为静态库时,它工作正常。现在我想把它变成一个共享库。库已创建并位于适当的位置,但是当我尝试编译客户端代码时,链接阶段显示找不到库。

我已经尝试将其重命名为 al 或 dylib,但这也无济于事。当我将 -v 标志放在链接上时,我可以看到我的库路径就在那里。我也尝试了不同的路径。我使用了相对路径,但即使使用完整路径也找不到它。

库中的 Makefile:

.SUFFIXES:
.SUFFIXES: .o .cpp
.SUFFIXES: .o .d

CC := g++
LNK:= g++

CXXFLAGS_RELEASE = -fPIC -shared -O2 -Wall -fmessage-length=0
CXXFLAGS_DEBUG = -fPIC -shared -g -Wall -fmessage-length=0 -D _DEBUG

CXXFLAGS = $(CXXFLAGS_DEBUG)

OBJDIR:= obj
SRCDIR:= src
HDIR:= include

INCLUDE_PATHS:= -Iinclude -Iinclude/interfaces -Iinclude/support

CPP_FILES := propertyfile/propertyfile.cpp \
propertyfile/propertyitem.cpp \
propertyfile/propertyfactory.cpp \
helper/string_helper.cpp

OBJ := $(patsubst %.cpp,$(OBJDIR)/%.o, $(CPP_FILES))
SRC := $(patsubst %.cpp,$(SRCDIR)/%.o, $(CPP_FILES))

LIBS:=

TARGET:= libsupport.so

all: $(TARGET)

$(TARGET): $(OBJ)
$(LNK) -o $(TARGET) $(OBJ) -shared
@cp $(TARGET) ../lib
@cp -r include ..

clean:
rm -f $(OBJ) $(ASM) $(TARGET)

-include $(patsubst %.cpp,$(OBJDIR)/%.d, $(CPP_FILES))

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(OBJDIR)/%.d
@mkdir -p `dirname $@`
$(CC) $(CXXFLAGS) -c $< -o $@ $(INCLUDE_PATHS)

$(OBJDIR)/%.d: $(SRCDIR)/%.cpp
@mkdir -p `dirname $@`
$(CC) $(CXXFLAGS) -MM -MT $@ -MF $(OBJDIR)/$*.d -c $< $(INCLUDE_PATHS)

这是应用程序的 Makefile:

.SUFFIXES:
.SUFFIXES: .o .cpp

CC := g++
LD := g++

CXXFLAGS_RELEASE = -O2 -Wall -fmessage-length=0
CXXFLAGS_DEBUG = -g -Wall -fmessage-length=0 -D _DEBUG
CXXFLAGS = $(CXXFLAGS_DEBUG)

OBJDIR:= obj
SRCDIR:= src

INCLUDE_PATHS:= -Iinclude -I../include
LIBS:= -L /cygdrive/d/src/c/lib -lsupport

CPP_FILES := nohupshd.cpp \
daemon.cpp \
task.cpp

OBJ := $(patsubst %.cpp,$(OBJDIR)/%.o, $(CPP_FILES))
SRC := $(patsubst %.cpp,$(SRCDIR)/%.o, $(CPP_FILES))

TARGET:= nohupshd

all: $(TARGET)

$(TARGET): $(OBJ)
$(LD) -o $(TARGET) $(OBJ) $(LIBS)

clean:
rm -f $(OBJ) $(ASM) $(TARGET)

-include $(patsubst %.cpp,$(OBJDIR)/%.d, $(CPP_FILES))

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(OBJDIR)/%.d
@mkdir -p `dirname $@`
$(CC) $(CXXFLAGS) -c $< -o $@ $(INCLUDE_PATHS)

$(OBJDIR)/%.d: $(SRCDIR)/%.cpp
@mkdir -p `dirname $@`
$(CC) $(CXXFLAGS) -MM -MT $@ -MF $(OBJDIR)/$*.d -c $< $(INCLUDE_PATHS)

最佳答案

经过一些试验,我找到了如何在 cygwin 下编译共享库的解决方案。

显然编译器正在寻找一个 DLL 文件,即使它在 cygwin 中。所以第一步是添加您的路径,库将位于 PATH 变量的位置。

 export PATH=$PATH:/cygdrive/d/src/c/lib

显然,当链接到一个共享库时,链接器似乎默认寻找一个 DLL 文件。我不知道为什么,因为在 cygwin 中我希望它像在其他 UNIX 系统上一样查找 .so 文件。

但是,有两种解决方案可以解决这个问题。

首先,您可以使用名称 .dll 创建指向您的 .so 库的链接

ln -s /cygdrive/d/src/lib/libsupport.so libsupport.dll

在这种情况下,makefile 不必更改,-lsupport 将在链接时找到库。我更喜欢这个解决方案。

其次,您可以使用全名指定链接器选项。

LIBS:=      -L /cygdrive/d/src/c/lib -l:libsupport.so

那么您不必创建链接。

所以关键的似乎是共享库必须在cygwin下的PATH中。在这种情况下,使用 LD_LIBRARY_PATH 没有帮助,因为您可以链接可执行文件,但在尝试运行它时,它不会找到它。

ldd nohupshd.exe

libsupport.so => not found

更新:出于某种原因,当我检查 ldd 时,我的图书馆突然从列表中消失了。我发现 cygwin 使用名称来区分 MS Windows 和 Unix 共享库。因此,为了使其工作,库的名称必须是 cyg.so 才能使其工作,否则可执行文件似乎是某些 Windows 版本。在这种情况下,您不需要创建名为 x.dll 的链接,因为共享库保留在 Unix 环境中。

    $(LNK) -o cyg$(TARGET).so $(OBJ) -shared  

使用eclipse调试时,共享库的路径也必须在windows的path环境变量中。否则,调试 session 会立即终止而不会出现错误。

关于c++ - cygwin g++ 链接器找不到共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16154130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com