2013-04-22 66 views
7

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

我已经尝试将其重命名为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 [email protected]` 
    $(CC) $(CXXFLAGS) -c $< -o [email protected] $(INCLUDE_PATHS) 

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

这里IST 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 [email protected]` 
    $(CC) $(CXXFLAGS) -c $< -o [email protected] $(INCLUDE_PATHS) 

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

回答

11

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

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

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

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

但是,有两个解决方案,这两个解决方案。

首先,你可以创建一个名称的链接到你的.so库的.dll

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

在这种情况下生成文件没有被改变,-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路径环境变量中。否则,调试会话立即终止而不会出现错误。