c - Makefile LINK.cc - main.o 被放在链接库之后并导致错误
问题描述
我正在关注如何制作makefile的本教程。我在下面为我的项目制作了一个。但是,链接阶段和文件顺序存在问题。
该教程说LINK.cc
使用 cxx、cxxflags、ldflags 并定义为
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
命令行给出了这个输出,表明main.o
它应该在链接之后放置在手头。
gcc -I./include -I/usr/local/include/upm -c -o utils.o utils.c
g++ -I./include -I/usr/local/include/upm -L/usr/local/lib/x86_64-linux-gnu -L/usr/local/lib/ -lrabbitmq -lupmc-rn2483 -lupmc-utilities -lupmc-rn2903 main.o utils.o -o myprogram
正确的命令:
gcc main.o -I./include -I/usr/local/include/upm -L/usr/local/lib/x86_64-linux-gnu -L/usr/local/lib/ -lrabbitmq -lupmc-rn2483 -lupmc-utilities -lupmc-rn2903 utils.o -o myprogram
我的问题是如何修复makefile?
生成文件
program_NAME := myprogram
program_C_SRCS := $(wildcard *.c)
program_CXX_SRCS := $(wildcard *.cpp)
program_C_OBJS := ${program_C_SRCS:.c=.o}
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.o}
program_OBJS := $(program_C_OBJS) $(program_CXX_OBJS)
program_INCLUDE_DIRS := ./include /usr/local/include/upm
program_LIBRARY_DIRS := /usr/local/lib/x86_64-linux-gnu /usr/local/lib/
program_LIBRARIES := rabbitmq upmc-rn2483 upmc-utilities upmc-rn2903
CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))
CC = gcc
CXX = g++
LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)
LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
.PHONY: all clean distclean
all: $(program_NAME)
$(program_NAME): $(program_OBJS)
$(LINK.cc) $(program_OBJS) -o $(program_NAME)
clean:
@- $(RM) $(program_NAME)
@- $(RM) $(program_OBJS)
distclean: clean
这是目录结构:
.
├── include
│ └── utils.h
├── main.c
├── Makefile
└── utils.c
解决方案
不要将库(-l)放入,而是LDFLAGS
将它们放入。LDLIBS
使用的链接规则make
是:
$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
您的 makefile 的更改是
LDLIBS += $(foreach library,$(program_LIBRARIES),-l$(library))
[...]
$(LINK.cc) $(program_OBJS) -o $(program_NAME) $(LDLIBS)
推荐阅读
- python - UTC 到 CST 转换使用日期时间不正确
- reactjs - 如何进行有限的 API 调用,然后在返回后替换为完整的 API 调用?
- botframework - 在机器人框架中存储用户和机器人响应
- python - 有没有办法在熊猫数据框中附加一个列表?
- elasticsearch - Logstash - Dissect 的映射是否支持多重匹配?
- c++ - 裸机嵌入式单元测试 ISR
- ruby-on-rails - 将带有字节的字符串数字转换为rails中的整数(“32MB”-> 32.megabytes)
- angular - Angular 9 Ivy 模板类型检查'对象可能是'null''
- c# - 我们可以在不使用 SAS 令牌的情况下通过 c# 代码调用 Azure API 管理吗
- c++ - 使用 C++ boost::asio::async_read_until 读取 HTTP POST 正文