簡體   English   中英

cygwin g ++鏈接器找不到共享庫

[英]cygwin g++ Linker doesn't find shared library

我一直在創建圖書館。 當我將其編譯為靜態庫時,它可以正常工作。 現在,我想將其轉換為共享庫。 庫已創建並放置在正確的位置,但是當我嘗試編譯客戶端代碼時,鏈接階段說找不到該庫。

我已經嘗試將其重命名為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下編譯共享庫的解決方案。

顯然,即使編譯器在cygwin中,它也在尋找DLL文件。 因此,第一步是添加路徑,庫將位於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路徑環境變量中。 否則,調試會話將立即終止而不會出現錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM