簡體   English   中英

使用Makefile構建共享庫

[英]Building shared libraries with Makefile

我有一個項目想要為其建立共享庫。 以下Makefile起作用:

libfastpd.so: fastpd.cpp
    $(CXX) -std=c++11 -fPIC -c fastpd.cpp -o fastpd.o
    $(CXX) -std=c++11 -fPIC -c graph.cpp -o graph.o
    $(CXX) -std=c++11 -fPIC -c LinkedBlockList.cpp -o LinkedBlockList.o
    $(CXX) -std=c++11 -fPIC -c maxflow.cpp -o maxflow.o
    $(CXX) -std=c++11 -shared  -Wl,-soname,libfastpd.so -o libfastpd.so fastpd.o graph.o LinkedBlockList.o maxflow.o

clean:
    rm *.o *.so

然后我在Cogswell等人的C ++ Cookbook中找到了這個食譜: https : //www.oreilly.com/library/view/c-cookbook/0596007612/ch01s18.html,並決定基於此來改進我的Makefile:

# Specify extensions of files to delete when cleaning
CLEANEXTS   = o so

# Specify the source files, the target files, 
# and the install directory 
SOURCES  = fastpd.cpp graph.cpp LinkedBlockList.cpp maxflow.cpp
OUTPUTFILE  = libfastpd.so
INSTALLDIR  = ./


.PHONY: all
all: $(OUTPUTFILE)

# Build lib*.so from all the *.o;
# subst is the search-and-replace 
# function demonstrated in Recipe 1.16
$(OUTPUTFILE): $(subst .cpp,.o,$(SOURCES)) 
    $(CXX) -shared -fPIC $(LDFLAGS) -o $@ $^

.PHONY: install
install:
    mkdir -p $(INSTALLDIR)
    cp -p $(OUTPUTFILE) $(INSTALLDIR)

.PHONY: clean 
clean:
    for file in $(CLEANEXTS); do rm -f *.$$file; done

# Generate dependencies of .ccp files on .hpp files
include $(subst .cpp,.d,$(SOURCES))

%.d: %.cpp
    $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$

運行此文件,我得到以下錯誤:

/usr/bin/ld:fastpd.o:在創建共享庫時,不能使用針對“ .rodata”的R_X86_64_32重定位; 用-fPIC fastpd.o重新編譯:添加符號時出錯:值錯誤

檢查終端輸出,觀察到執行了以下命令:

g++    -c -o fastpd.o fastpd.cpp
g++    -c -o graph.o graph.cpp
g++    -c -o LinkedBlockList.o LinkedBlockList.cpp
g++    -c -o maxflow.o maxflow.cpp

沒有-fPIC

我的問題是: Makefile的哪幾行執行這些命令,以及如何向它們添加-fPIC

任何對理解上述整個Makefile的良好資源的引用也將不勝感激!

預先非常感謝您的幫助!

Makefile的哪幾行執行這些命令...?

簡短的答案是沒有 規則...

$(OUTPUTFILE): $(subst .cpp,.o,$(SOURCES)) 
        $(CXX) -shared -fPIC $(LDFLAGS) -o $@ $^

僅指定鏈接時間依賴性和命令。 在編譯源文件時,需要指定-fPIC選項,但尚未提供任何從.cpp構建.o規則,因此make依賴於其隱式規則 (對於本示例而言)實質上是...

%.o: %.cpp
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<

因此,顯而易見的解決方案是將-fPIC添加到CXXFLAGS ...

CXXFLAGS += -fPIC

暫無
暫無

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

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