【发布时间】:2014-07-18 15:43:23
【问题描述】:
我一直在构建一个 C++11 库,并且头文件/源文件的数量已经增长到编译调用它的程序的地步,需要将 20 多个 .cpp 文件传递给 g++。我一直在阅读共享库,这似乎是最好的解决方案。
但是,由于标头/源代码经常更改,我希望创建一个 makefile,它会自动从标头和源代码生成所有 .so 文件。
为了更好地展示我正在尝试做什么,我将使用我的一个子库 Chrono 并展示我将如何手动执行此操作。
我首先像这样创建目标文件,
$ g++ -std=c++11 -fPIC -g -c -Wall ../src/Chrono/cpp/DateTime.cpp
$ g++ -std=c++11 -fPIC -g -c -Wall ../src/Chrono/cpp/Schedule.cpp
$ g++ -std=c++11 -fPIC -g -c -Wall ../src/Chrono/cpp/Duration.cpp
$ g++ -std=c++11 -fPIC -g -c -Wall ../src/Chrono/cpp/DayCount.cpp
所以我现在在当前目录中有DateTime.o、Schedule.o、Duration.o 和DayCount.o。然后我创建.so 文件,
$ g++ -shared -Wl,-soname,libChrono.so.1 -o libChrono.so.1.0.1 DateTime.o Schedule.o Duration.o DayCount.o -lc
那我走了,
$ rm ./*.o && ldconfig -n ./
所以我的工作目录现在包含 libChrono.so.1.0.1 和符号链接 libChrono.so.1。
我需要为很多子目录执行此操作,因此您可以看到,每当对标头/源进行更改时,这很快就会变得低效。如果有人可以帮助我设计一个只需调用 make 即可完成所有这些工作的 makefile,我将不胜感激。
谢谢!
更新:
根据 goldilock 的建议和一些挖掘,我设法凑到了一起:
CXX=g++
CFLAGS=-std=c++11
TARGET=./lib/libChrono.so.1.0.1
CHRONODIR=./src/Chrono
CHRONOSRC=$(wildcard $(CHRONODIR)/cpp/*.cpp)
CHRONOOBJ=$(join $(addsuffix ../obj/, $(dir $(CHRONOSRC))), $(notdir (CHRONOSRC:.cpp=.o)))
all: $(TARGET)
@true
clean:
@-rm -f $(TARGET) $(CHRONOOBJ)
./lib/libChrono.so.1.0.1: $(CHRONOOBJ)
@echo "======================="
@echo "Creating library file $@"
@echo "======================="
@$(CXX) -shared -Wl,-soname,$(join $(basename $@), .1) -o $@ $^ -l
@echo "-- $@ file created --"
$(CHRONODIR)/cpp/../obj/%.o : $(CHRONOSRC)
@mkdir -p $(dir $@)
@echo "============="
@echo "Compiling $<"
@$(CXX) $(CFLAGS) -fPIC -g -Wall -c $< -o $@
4 .o 文件是在 lib/ 中生成的,但我收到了来自 ld 的多个定义投诉。在我单独编译目标文件之前,但这会将CHRONOOBJ 展开为一行。有什么想法吗?
【问题讨论】:
-
'如果有人能帮助我设计一个只需调用 make 即可完成所有这些工作的 makefile,我将不胜感激。' 抱歉,不!像往常一样,SO 不会为您的服务构建代码工厂。既不适用于 c++ 代码,也不适用于 makefile 编码。
-
你有你需要的命令,只要把它放在makefile中。如果您根本不知道如何制作makefile,那么这个问题就很宽泛了。你可能想search for makefile tutorials。