[英]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.