通过 makefile 链接文件

Posted

技术标签:

【中文标题】通过 makefile 链接文件【英文标题】:Linking files through makefiles 【发布时间】:2014-08-07 04:08:14 【问题描述】:

我在同一级别有两个目录。我想使用在另一个目录的源文件中的一个目录中创建的头文件。我想在不提供头文件的相对或绝对路径的情况下实现相同的目标。

目录结构为:

main_dir/
  dir1/
     main.cpp
     Makefile.am
  dir2/
     abc.h
     abc.cpp
     Makefile.am

main.cpp 需要abc.h。两个目录的 makefile 中应该写什么来链接它们?

编辑

dir2 的 Makefile.am

noinst_LIBRARIES = libabc.a
AM_CPPFLAG = -I$(main_dir)/dir2 \
     $(APP_CFLAGS)

libabc_a_SOURCES = abc.h \
     abc.cpp

dir1 的 Makefile.am

noinst_LIBRARIES = libmain.a
AM_CPPFLAG = -I$(main_dir)/dir1 \
     $(APP_CFLAGS)

libmain_a_SOURCES = main.cpp

libmain_a_LIBADD = libabc.a

我收到错误:No rule to make target 'libabc.a', needed by 'libmain.a'. Stop.

【问题讨论】:

你要么需要提供每个文件的相对/完整路径,要么使用类似vpath 指令的东西。 通过“链接它们”,您是否想让 main.cpp 中的#include <abc.h> 包含 main_dir/dir2/abc.h? @immibis 是的,我想要那个! @immibis 任何想法如何实现它? 【参考方案1】:

您可以在 gcc 或 clang 中使用 -I 选项。 (注意这与makefile没有直接关系)

示例:如果当前目录是 main_dir,并且您当前正在运行命令:

gcc -c -o dir1/main.o dir1/main.cpp

您需要将其更改为:

gcc -Idir2 -c -o dir1/main.o dir1/main.cpp

【讨论】:

我只需要在 makefile 中执行此操作。我已经编辑了我的问题。请检查!【参考方案2】:

你已经有了

AM_CPPFLAG = -I$(main_dir)/dir1 \
     $(APP_CFLAGS)

只需在其中添加-I$(main_dir)/dir2

AM_CPPFLAG = -I$(main_dir)/dir1 \
    -I$(main_dir)/dir2 \
    $(APP_CFLAGS)

所以现在你可以在你的代码中#include <abc.h>

【讨论】:

以上是关于通过 makefile 链接文件的主要内容,如果未能解决你的问题,请参考以下文章

Makefile常用万能模板(包括静态链接库动态链接库可执行文件)

Makefile常用万能模板(包括静态链接库动态链接库可执行文件)

makefile : 如何链接目标文件

如何在此高级 makefile 中链接两个 .c 文件?

makefile 想要链接 math怎么连不上 说没有找到头文件

生成一个 Makefile,使用 Automake 一步编译和链接所有源文件