c++ - 编写 makefile 来构建动态库

标签 c++ makefile dynamic-linking

我的 src 目录中有一个 makefile。 makefile 应该构建数据结构,在 DataStructures/中,然后遍历 calculations/中的所有 cpp 文件,并在 ../bin/calculations 中创建相应的 .so 文件

我尝试了以下语法:

DAST = DataStructures/ 
COMPS = computations/ 
BIN = ../bin/ 
OBJECTS = ${DAST}Atom.o ${DAST}Molecule.o
COMPILE = g++ -Wall -g -c -std=c++0x -I/usr/local/include/openbabel-2.0 LINK = g++ -Wall -g -std=c++0x ${OBJECTS} -lopenbabel -I/usr/local/include/openbabel-2.0

all: ${BIN}main ${DAST}Molecule.o ${DAST}Atom.o ${BIN}${COMPS}%.so

${BIN}main: ${OBJECTS} main.cpp
    ${LINK} main.cpp -o ${BIN}main

${DAST}Molecule.o: ${DAST}Molecule.h ${DAST}Molecule.cpp    
    ${COMPILE} ${DAST}Molecule.cpp -o ${DAST}Molecule.o

${DAST}Atom.o: ${DAST}Atom.h ${DAST}Atom.cpp
    ${COMPILE} ${DAST}Atom.cpp -o ${DAST}Atom.o

${BIN}${COMPS}%.o: ${COMPS}%.cpp
    gcc -Wall -fPIC -c -lopenbabel $< -I/usr/local/include/openbabel-2.0 -std=c++0x

${BIN}${COMPS}%.so: ${COMPS}%.o
    gcc -shared -Wl,-soname,libcsmtest.so.1 -o libcsmtest.so $@

clean:
    rm -rf ${OBJECTS}

.PHONY: all clean

但它显然不起作用,因为我得到以下输出:

shai@ubuntu:~/csm/csm2/src$ make all
make: *** No rule to make target `../bin/computations/%.so', needed by 'all'.  Stop.

谢谢

最佳答案

您需要在 all: 中指定目标,明确的先决条件。

在 Makefile 中,% 是一个可以在自动规则中使用的通配符。然而,all: target 是一个没有这种通配符的简单目标,因此 ${BIN}${COMPS}%.so在这种情况下是错误的。

请注意,当我在这个上下文中说“通配符”时,这个通配符将目标与先决条件相匹配,而不是像 * 这样的文件系统。在 glob 表达式中做。


另外,虽然你的哈特在正确的地方,但作为风格问题,你的 Makefile 可以更好:

  • 中间对象,不应该是all的先决条件目标,但只有您希望运送的最终目标。
  • 混合了自动规则和简单规则来指定对象的创建。
  • 通常不会为 %.so 编写自动规则,因为图书馆通常由多个对象构成。
  • 目标文件和头文件之间的依赖关系是一个复杂的问题。简而言之,您需要指定结果对象取决于 *.cpp (或 .c )以及 *.cpp 包含的所有 header (直接和间接)文件。
  • 按照惯例,GNU make 很好地支持它,而不是使用 ${COMPILE}正如你所做的那样,应该使用 $(CXX)用于您的 C++ 编译器,以及 $(CXXFLAGS)对于您希望传递给该编译器的标准标志。

关于c++ - 编写 makefile 来构建动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5565912/

相关文章:

c++ - 循环 vector 时自动删除对象

c++ - 理解和解析来自 gcc 的警告

linux - 谁执行运行时重定位?

c++ - 如何将一个数字(大于 8 个字节)从 char 数组转换为其 ASCII 表示形式?

c++ - 定义运算符的实际原因!=

c++ - 循环向后打印字符串

c++ - 在 Windows 和 Linux 下处理不同源目录和对象目录的 Makefile

windows - 在 makefile 中运行命令并将 STDERR/STDOUT 打印到终端和文本文件

c++ - 使本地 c 库函数可全局访问

ios - XCode 中的项目间通信