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