之前我们在文件路径下需要敲好几条命令才能编译生成动态库文件,而如果要拷贝安装文件或删除不用的文件时也要添加额外的命令。这样如果每次都要编译、安装、删除就比较麻烦。而如果我们写了一个makefile之后,接下来的工作只需要敲一条命令即可。下面是lib路径下用来生产静态库和动态库的makefile文件:
建立一个新的目录,然后把这三个文件拷贝到目录中,也把
Makefile 文件拷贝到目录中。之后,对
Makefile 的相关项目进行如下设置:
PROGRAM := hello # 设置运行程序名
SRCDIRS := . # 源程序位于当前目录下
SRCEXTS := .c .cxx # 源程序文件有 .c 和 .cxx 两种类型
add_custom_command: 增加客制化的构建规则到生成的构建系统中。对于add_custom_command,有两种使用形式。第一种形式是增加一个客制命令用来产生一个输出。
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1[ARGS] [args1...]
转发链接:https://www.cnblogs.com/JoyPoint/p/11629521.html
我们经常会遇到将第三方库文件复制到项目运行时文件夹,或者将子项目生成的库文件复制到项目运行时文件夹的情况,本文介绍FILE-COPY、add_custom_command、ADD_CUSTOM_TARGET三种方法及CMake COMMAND提供的命令说明。
一、 FILE-COPY
#设置当编译路径为当前文件夹所在路径
LOCAL_PATH := $(call my-dir)#清空编译环境的变量(由其他模块设置过的变量)
include $(CLEAR_VARS)其中:
#BUILD_STATIC_LIBRARY:编译为静态库。
#BUILD_SHARED_LIBRARY :编译为动态库
#BUILD_EXECUTABLE:编译为Native C可执行程序
LOCAL_P
好的,让我来解答你的问题。
在编写Makefile时,我们可以使用动态编译来构建我们的程序。动态编译意味着在运行时加载库,并将其链接到我们的程序中,而不是在编译时将库静态链接到我们的程序中。
下面是一个简单的Makefile示例,它使用动态编译来构建程序:
# 编译器
CC = gcc
# 编译选项
CFLAGS = -Wall -O2
# 链接选项
LDFLAGS = -lm
# 目标文件
TARGET = program
# 源文件
SRCS = main.c foo.c bar.c
# 中间文件
OBJS = $(SRCS:.c=.o)
# 默认目标
all: $(TARGET)
# 生成可执行文件
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
# 生成中间文件
%.o: %.c
$(CC) $(CFLAGS) -fPIC -c -o $@ $<
clean:
rm -f $(OBJS) $(TARGET)
在上面的Makefile中,我们使用了一个变量 `LDFLAGS` 来指定我们要链接的库,这里我们链接了标准数学库 `libm`。同时,我们在编译选项 `CFLAGS` 中加入了 `-fPIC` 参数,以告诉编译器生成位置无关代码,用于动态链接。
在生成中间文件时,我们使用了通配符 `%.o` 来匹配所有的 `.c` 文件,并将其编译为对应的 `.o` 文件。
最后,我们定义了一个 `clean` 目标来清理中间文件和生成的可执行文件。
希望这个示例能够帮助你理解如何在Makefile中使用动态编译。