c++ - Makefile 应该在另一个目录中搜索 .o 文件

标签 c++ compilation makefile linker autoconf

所以我正在使用 autoconf 生成一个 Makefile,我已经成功地这样做并编译了我的项目,但问题是目标文件是在 src 文件夹中创建的。我希望将它们编译到 .libs 文件夹中。

我也能做到这一点,但随后出现另一个问题,编译器在与 .cpp 文件相同的文件夹中搜索这些 .o 文件(这是 src)。

我已经尝试了一切,包括:

%.o: $(SDIR)/%.cpp
        $(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c $<

$(OBJDIR)/%.o: %.c
        $(CC) -c -o $@ $< $(CFLAGS)

还有许多我什至不记得的其他组合。 出于某种原因,这些规则并没有最终在 .libs 文件夹中寻找目标文件,我在运行 make 时遇到错误:

g++: error: One.o: No such file or directory
g++: error: Two.o: No such file or directory
g++: error: Three.o: No such file or directory
g++: error: Four.o: No such file or directory

到目前为止,这是我的 Makefile.am:

CFLAGS=-Wall -I/chome/siddhs/soft/soft_source_code/target/src/include/ -I/home/siddhs/EclipseProjects/rdma2/include
AM_LDFLAGS=-L /usr/pbs/new/exec/lib/ -lsoft -lpthread -llmx-altair -L /usr/lib/x86_64-linux-gnu/ -lcrypto -L . -lsoft

OUT=rdma2.a
CC=g++
OBJDIR=/home/siddhs/EclipseProjects/rdma2/.libs
SDIR=/home/siddhs/EclipseProjects/rdma2/src
INC=-Iinc
ADIR=/usr/local/rdma2/

bin_PROGRAMS=rdma2test

rdma2test_SOURCES = One.cpp Two.cpp Three.cpp Four.cpp
rdma2test_LDADD=-L /usr/soft/new/exec/lib -lsoft -lpthread -L /usr/lib/x86_64-linux-gnu/ -lcrypto

_OBJS = One.o Two.o Three.o Four.o

%.o: $(SDIR)/%.cpp
        $(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c $<

$(OBJDIR)/%.o: %.c
        $(CC) -c -o $@ $< $(CFLAGS)

最佳答案

最简单的方法是在 .libs 目录中创建第二个 Makefile.am。顶部的 Makefile.am 只需指向第二个 Makefile.am。第二个将描述所有构建过程。

一个简单的示例将包含以下内容。

Makefile.am

SUBDIRS = .libs

.libs/Makefile.am

bin_PROGRAMS=rdma2test
noinst_LIBRARIES= librdma2.a
AM_LDFLAGS=-L.
librdma2_a_SOURCES = $(SRC)/One.cpp $(SRC)/Two.cpp
rdma2test_SOURCES = $(SRC)/Main.cpp
rdma2test_LDADD= -lrdma2 

configure.ac

AC_INIT([rdma2],[1.0])
AC_CONFIG_SRCDIR([src/Main.cpp])
AM_INIT_AUTOMAKE
AC_PROG_CXX(g++)
AC_PROG_RANLIB
SRC=`pwd`"/src"
AC_SUBST(SRC)
AC_OUTPUT([Makefile .libs/Makefile])

注意:使用此配置,automake 的更高版本会发出警告消息。

关于c++ - Makefile 应该在另一个目录中搜索 .o 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36124596/

相关文章:

c - 返回值的函数定义中的缺失 - 什么类型的错误?

c - 这个 Makefile 正确吗?

c++ - 在 c/c++ 中更改 Windows 服务的状态

c++ - 指向数组的指针获取大小 C++

c++ - 指向 D3D11device vtable 的正确指针

java - 使用 makefile 无法找到或加载主类

c++ - Makefile 定义文件夹结构以查找程序并包含

c++ - STL - 复制混合容器

java - JDK8编译速度慢

visual-studio - 在您的 Visual Studio 中拥有更多项目是否会增加编译时间?