cygwin g ++ Linker找不到共享库

Dev*_*lus 9 c++ shared

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

我已经尝试将其重命名为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)
Run Code Online (Sandbox Code Playgroud)

这是应用程序的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)
Run Code Online (Sandbox Code Playgroud)

Dev*_*lus 15

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

显然编译器正在寻找一个DLL文件,即使它在cygwin中.所以第一步是添加你的路径,库将转到PATH变量.

 export PATH=$PATH:/cygdrive/d/src/c/lib
Run Code Online (Sandbox Code Playgroud)

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

但是,有两种解决方案可以解决.

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

ln -s /cygdrive/d/src/lib/libsupport.so libsupport.dll
Run Code Online (Sandbox Code Playgroud)

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

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

LIBS:=      -L /cygdrive/d/src/c/lib -l:libsupport.so
Run Code Online (Sandbox Code Playgroud)

那么你不必创建一个链接.

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

ldd nohupshd.exe

libsupport.so => not found
Run Code Online (Sandbox Code Playgroud)

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

    $(LNK) -o cyg$(TARGET).so $(OBJ) -shared  
Run Code Online (Sandbox Code Playgroud)

使用eclipse进行调试时,共享库的路径也必须位于Windows路径环境变量中.否则,调试会话会立即终止而不会出现错误.