在 Makefile 中添加 INCLUDE、LIB 和 LD_LIBRARY_PATH

Posted

技术标签:

【中文标题】在 Makefile 中添加 INCLUDE、LIB 和 LD_LIBRARY_PATH【英文标题】:Adding INCLUDE, LIB and LD_LIBRARY_PATH in Makefile 【发布时间】:2018-06-19 12:48:07 【问题描述】:

我正在编写一个新的 Makefile,并希望将我的目标文件复制到 obj/ 文件夹中。我试图添加 OBJ 目录文件夹,但它没有拿起。我确定我错过了一些东西。现在我在编译后将 .o 文件从 src/ 文件夹移动到 obj/ 文件夹。

请告诉我如何在这个 makefile 中添加 INCLUDES 和 LIB_INCLUDES。由于 Makefile 中没有包含路径,因此希望我在包含头文件的同时在源代码中指定完整(相对)路径。

另外,我想在我的可执行文件中静态包含一些外部库(LD_LIBRARY_PATH),那么如何在 Makefile 中指定它们:

APPNAME := MyApp.x
SOURCE_DIR   := ./src
INCLUDE_DIR  := ./include
OBJECT_DIR   := ./obj
BIN_DIR      := ./bin

CC := g++
CCFLAGS := -g -Wall

SRCFILES     := $(wildcard $(SOURCE_DIR)/*.cpp)
INCLUDES     := $(INCLUDE_DIR)
LIB_INCLUDES := $(INCLUDE_DIR)
OBJECTS      := $(patsubst %.cpp, %.o, $(SRCFILES))

all: $(APPNAME)

$(APPNAME): $(OBJECTS)
        $(CC) $(CCFLAGS) $(LDFLAGS) -o $(BIN_DIR)/$(APPNAME) $(OBJECTS) $(LDLIBS)
        \mv -f $(SOURCE_DIR)/*.o obj

depend: .depend

.depend: $(SRCFILES)
        rm -f ./.depend
        $(CC) -I$(INCLUDES) $(CCFLAGS) $^>>./.depend;

clean:
        rm -f $(OBJECTS)

dist-clean: clean
        rm -f *~ .depend

include .depend

为此请求创建了单独的线程 - lubgr。

【问题讨论】:

最后一行include .depend做了什么 LD_LIBRARY_PATH 影响运行时链接。也许您的意思是LD_RUN_PATH,它指定了ld 将合并到动态对象中以便在未来 运行时链接中搜索的目录? 我不会复制或移动对象。通常,您编译到所需的对象目标目录。除其他问题外,链接对象的目录可以存储在应用程序中以供调试器使用。我会更改 $(CC) -I$(INCLUDES) $(CCFLAGS) $^>>./.depend;使用 -o 选项直接输出到对象目录。 【参考方案1】:

试试这个(为简洁起见,我去掉了.depend 部分和clean 目标):

APPNAME := MyApp.x
SOURCE_DIR   := src
INCLUDE_DIR  := include
OBJECT_DIR   := obj
BIN_DIR      := bin

CC := g++
CCFLAGS := -g -Wall

SRCFILES     := $(wildcard $(SOURCE_DIR)/*.cpp)
INCLUDES     := $(INCLUDE_DIR)
OBJECTS      := $(SRCFILES:$(SOURCE_DIR)/%.cpp=$(OBJECT_DIR)/%.o)

all: $(BIN_DIR)/$(APPNAME)

$(BIN_DIR)/$(APPNAME): $(OBJECTS)
    $(CC) $(CCFLAGS) -o $@ $(OBJECTS)

$(OBJECT_DIR)/%.o: $(SOURCE_DIR)/%.cpp
    $(CC) $(CCFLAGS) -I$(INCLUDES) -o $@ -c $<

对于其他静态库,您可以将它们传递给链接器,就像目标文件一样,例如

STATIC_LIBS = lib/libfirst.a lib/libsecond.a

$(BIN_DIR)/$(APPNAME): $(OBJECTS)
    $(CC) $(CCFLAGS) -o $@ $(OBJECTS) $(STATIC_LIBS)

这在链接共享库时有所不同,但正如您所说,您的库都被编译成静态库,这应该可以工作。

【讨论】:

谢谢 lubgr。这个解决方案对我有用。我向 Makefile 添加了一些东西,但看起来都不错。非常感谢您在这件事上的帮助。

以上是关于在 Makefile 中添加 INCLUDE、LIB 和 LD_LIBRARY_PATH的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ref 添加到 Makefile 中的 1 头文件

具有 2 个源目录的 makefile 使包含保护失败

Makefile引用与环境变量

将库 .h 附加到 makefile

如何在makefile中使用OpenMP?

一点一点学写Makefile-增加第三方库和头文件