gpt4 book ai didi

c++ - 使用 Makefile 构建共享库

转载 作者:行者123 更新时间:2023-11-28 01:19:00 24 4
gpt4 key购买 nike

我有一个项目,我想为它构建一个共享库。以下 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: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC fastpd.o: error adding symbols: Bad value

检查终端输出,我观察到执行了以下命令:

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 的良好资源的引用也将不胜感激!

非常感谢您的帮助!

最佳答案

Which lines of the Makefile execute these commands... ?

简短的回答是。规则...

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

仅指定链接时间依赖项和命令。 -fPIC编译源文件时需要指定选项,但您没有提供任何规则来构建 .o来自.cpp所以make回到它的implicit rule这(为了这个例子的目的)本质上是......

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

所以显而易见的解决方案是添加 -fPICCXXFLAGS ...

CXXFLAGS += -fPIC

关于c++ - 使用 Makefile 构建共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57483108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com