首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Makefile构建共享库

用Makefile构建共享库
EN

Stack Overflow用户
提问于 2019-08-13 18:00:47
回答 1查看 741关注 0票数 0

我有一个项目,我想为它构建一个共享库。以下Makefile工作:

代码语言:javascript
复制
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”中发现了这个菜谱,并决定在此基础上改进我的制作文件:

代码语言:javascript
复制
# 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重新编译

在检查终端输出时,我注意到执行了以下命令:

代码语言:javascript
复制
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以上将非常感谢!

提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-13 18:44:38

Makefile的哪些行执行这些命令..。?

简单的回答是没有。规则..。

代码语言:javascript
复制
$(OUTPUTFILE): $(subst .cpp,.o,$(SOURCES)) 
        $(CXX) -shared -fPIC $(LDFLAGS) -o $@ $^

仅指定链接时间依赖项和命令。编译源文件时需要指定-fPIC选项,但没有提供从.cpp构建.o的任何规则,因此make回到了它的隐式规则上(就本例而言)本质上是.

代码语言:javascript
复制
%.o: %.cpp
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<

所以最明显的解决办法是在-fPIC中加入CXXFLAGS.

代码语言:javascript
复制
CXXFLAGS += -fPIC
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57483108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档