【发布时间】:2013-09-26 15:14:11
【问题描述】:
我正在做一个项目,我正在创建一个 .so 对象作为我的输出,其中包含几个用于另一个程序的运算符。我得到了一个运行良好的 Makefile,但它总是在我运行 make 时重新编译每个文件。最初这不是问题,但现在库中有超过 5 个或更多运算符,运行 make 非常慢。问题是,对于我的生活,我无法弄清楚如何将这个 Makefile 更改为我想要的行为方式,因为我以前从未处理过这种格式的 Makefile:
BOOST_LOCATION=/usr/local/boost_1_54_0
CFLAGS=-pedantic -W -Wextra -Wall -Wno-strict-aliasing -Wno-long-long -Wno-unused-parameter -fPIC -D__STDC_FORMAT_MACROS -Wno-system-headers -isystem -O2 -g -DNDEBUG -ggdb3 -D__STDC_LIMIT_MACROS
INC=-I. -DPROJECT_ROOT="\"$(IN_SOURCE_DIR)\"" -I"$(IN_SOURCE_DIR)/include" -I"$(BOOST_LOCATION)"
LIBS=-L"$(IN_SOURCE_DIR)/lib" -shared -Wl,-soname,libname.so -L. -lm
all:
@if test ! -d "$(IN_SOURCE_DIR)"; then echo "Error. Try:\n\nmake IN_SOURCE_DIR=<PATH TO SOURCE TRUNK>"; exit 1; fi
$(CXX) $(CFLAGS) $(INC) -o plugin.cpp.o -c plugin.cpp
$(CXX) $(CFLAGS) $(INC) -o LogicalFile1.cpp.o -c File1/LogicalFile1.cpp
$(CXX) $(CFLAGS) $(INC) -o PhysicalFile1.cpp.o -c File1/PhysicalFile1.cpp
$(CXX) $(CFLAGS) $(INC) -o LogicalFile2.cpp.o -c File2/LogicalFile2.cpp
$(CXX) $(CFLAGS) $(INC) -o PhysicalFile2.cpp.o -c File2/PhysicalFile2.cpp
### etc.
$(CXX) $(CFLAGS) $(INC) -o libname.so \
plugin.cpp.o \
LogicalFile1.cpp.o \
PhysicalFile1.cpp.o \
LogicalFile2.cpp.o \
PhysicalFile2.cpp.o \
### etc \
$(LIBS)
clean:
rm -f *.o *.so
我遇到的最大问题是只有一个规则(全部),我找不到执行此操作的 Makefile 示例或如何将其拆分为多个规则。
【问题讨论】:
-
这不是真正的makefile。它只是一个用 makefile 格式编写的 shell 脚本。您的整个“makefile”是一个调用编译所有内容的 shell 命令的规则。您不妨把它写成一个实际的 shell 脚本。我很难相信您找不到一次构建一个对象的 makefile 示例,因为您找到的每个示例 makefile 都会这样做。这就是使用 make 而不是 shell 脚本的全部点。
-
使用 autoconf/automake/libtool 来生成你的 makefile。最初的学习曲线有点痛苦(真的没有那么多),但回报是值得的。例如看那些教程:Building libs with autotools - Building with autotools - Using libs with autotools
标签: c++ makefile shared-libraries