我有一个项目,我想为它构建一个共享库。以下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然后,我在科斯韦尔等人的“C++烹饪书:https://www.oreilly.com/library/view/c-cookbook/0596007612/ch01s18.html”中发现了这个菜谱,并决定在此基础上改进我的制作文件:
# 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: Quickpd.o:在创建共享对象时不能使用重定位R_X86_64_32与`.rodata‘;用-fPIC重新编译
在检查终端输出时,我注意到执行了以下命令:
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以上将非常感谢!
提前感谢您的帮助!
发布于 2019-08-13 18:44:38
Makefile的哪些行执行这些命令..。?
简单的回答是没有。规则..。
$(OUTPUTFILE): $(subst .cpp,.o,$(SOURCES))
$(CXX) -shared -fPIC $(LDFLAGS) -o $@ $^仅指定链接时间依赖项和命令。编译源文件时需要指定-fPIC选项,但没有提供从.cpp构建.o的任何规则,因此make回到了它的隐式规则上(就本例而言)本质上是.
%.o: %.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<所以最明显的解决办法是在-fPIC中加入CXXFLAGS.
CXXFLAGS += -fPIChttps://stackoverflow.com/questions/57483108
复制相似问题