写makefile碰到点问题

本文介绍了一次使用Makefile进行项目编译时遇到的问题及解决过程。主要问题出现在链接阶段,仅一个.o文件被链接,而非预期的多个。通过逐步排查,发现编译指令中的$<符号导致了问题,最终将$<替换为$(OBJS)解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天同事有个工程要移到linux下,让我给他写了一个makefile的demo。结果我写的demo是可以编译运行了,但是加入了他的东西以后就是编译不出来。没办法,只能一点一点去找原因,结果发现在最后链接的时候,怎么只有一个.o文件。但是在makefile文件里面定义的是有多个的!再看一下编译选项,

$(TARGET):$(OBJS)
        $(CC) $(FLAG) -o $@ $<

好像也没有什么问题哦。在终端直接把编译的相关OBJ加上去,一编译就成功了,好像还是这个编译选项有问题。

想啊想啊,最后想到了$<,这个好像代表的是冒号(:)后面的第一个值,原来是这样啊,那直接用$(OBJS)来代替$<,结果一编译就成功了。

附makefile例子:

CC = g++

BINDIR = ../../../bin

OBJDIR = ../../../obj

FLAG = -Wall -g

OBJS = $(OBJDIR)/classtest.o $(OBJDIR)/inclass.o

TARGET = $(BINDIR)/classtest

all:$(TARGET)

$(TARGET):$(OBJS)
        $(CC) $(FLAG) -o $@ $(OBJS)

$(OBJDIR)/classtest.o:classtest.cpp
        $(CC) $(FLAG) -o $@ -c $<
$(OBJDIR)/inclass.o:inclass.cpp
        $(CC) $(FLAG) -o $@ -c $<

clean:
        rm -rf $(TARGET) $(OBJS)

 

### 解决方案 当遇到 `C++` 编译错误 `'没有那个文件或目录'` 或者在 `turtle_vel_ctrl_pkg` 的 CMake 构建中出现 makefile 错误 1 和 2,通常意味着存在路径配置不正确或者依赖项未满足等问题。 #### 文件路径问题 如果提示特定头文件或其他资源找不到,则可能是由于指定的路径有误。确保所有的源码文件、库以及头文件都位于预期的位置,并且这些位置已经在项目的 `CMakeLists.txt` 中正确定义[^1]。 对于 ROS2 工作空间中的项目来说,应该确认所有必要的包已经通过 `ament_cmake` 正确声明并安装到了工作区里。这可以通过检查 `setup.py` 或其他构建脚本里的包定义来完成。 #### Makefile 错误处理 针对提到的具体错误代码: - **Error Code 1**: 表明命令执行失败;这种情况下通常是某个阶段的任务未能成功完成,比如链接器无法找到所需的共享对象(.so),或者是编译期间遇到了语法上的问题- **Error Code 2**: 常见于 shell 脚本解析时发生致命错误的情形,但在 cmake/make 过程中也可能因为缺少权限等原因触发此错误。 为了更精确地定位问题所在,建议查看完整的日志输出,特别是那些带有警告标志的信息,它们往往能提供关于实际发生了什么的重要线索。 另外值得注意的是,在某些环境中可能会碰到与 Windows API 相关类型的转换异常,例如上述WNDPROC返回值不能被转化为LRESULT的情况,这类问题是平台特有的,可能需要调整应用程序接口(API)调用来适配当前操作系统环境。 最后,考虑到ROS系统的特殊性,还需要验证是否正确设置了环境变量如PYTHONPATH等,以确保Python模块能够正常导入和运行[^2]。 ```cpp // Example of checking include directories in CMakeLists.txt include_directories( ${catkin_INCLUDE_DIRS} ) add_executable(${PROJECT_NAME}_node src/node.cpp) target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES}) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值