通过 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常用万能模板(包括静态链接库动态链接库可执行文件)