Ubuntu下无IDE开发嵌入式机器视觉C++项目:简化编译与库链接
我太懂这种烦躁了——每次编译都要敲一堆-I、-L、-l参数,明明Python装个包就能直接用,C却要手动折腾链接。针对你嵌入式系统下的C开发需求,这里有几个实用的方案,帮你实现像Python那样简洁的开发测试流程:
Makefile是最轻量化的编译自动化工具,写一次就能重复用,完全替代冗长的bash命令。针对你的sign.cpp,可以写一个这样的Makefile:
# 定义编译器和基础编译参数 CXX = g++ CXXFLAGS = -std=c++11 -Wall # -Wall开启警告,方便调试 # 头文件路径和库路径(如果是非系统默认路径) INCLUDES = -I/usr/local/include LDFLAGS = -L/usr/local/lib # 需要链接的库 LIBS = -lcrypto -ljwt # 最终生成的可执行文件名称 TARGET = sign # 默认执行目标:编译生成可执行文件 all: $(TARGET) # 编译规则:从.cpp文件生成可执行文件 $(TARGET): sign.cpp $(CXX) $(CXXFLAGS) $(INCLUDES) $(LDFLAGS) $^ -o $@ $(LIBS) # 清理生成的文件 clean: rm -f $(TARGET)
写完后,你只要在终端敲make就能自动编译,想清理编译产物就敲make clean,完全不用再输那串长命令。
如果你的项目后续会增加更多文件或依赖,CMake比Makefile更易维护,还能轻松支持嵌入式交叉编译。写一个CMakeLists.txt:
cmake_minimum_required(VERSION 3.10) project(SignTool) # 强制使用C++11标准 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 添加要编译的可执行文件 add_executable(sign sign.cpp) # 指定头文件搜索路径 target_include_directories(sign PRIVATE /usr/local/include) # 链接需要的库 target_link_libraries(sign PRIVATE crypto jwt)
使用步骤:
- 创建编译目录(避免污染源码):
mkdir build && cd build - 生成编译文件:
cmake .. - 编译:
make
之后每次修改代码,只要回到build目录敲make就行。如果是嵌入式交叉编译,只要在cmake命令前指定交叉工具链,比如:
cmake -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ ..
灵活性拉满。
很多第三方库(比如你用到的crypto、jwt)支持pkg-config工具,它能自动识别库的头文件路径和链接参数,帮你省去手动写-I和-L的麻烦。
修改下Makefile,用pkg-config替代硬编码路径:
CXX = g++ CXXFLAGS = -std=c++11 -Wall $(shell pkg-config --cflags libcrypto libjwt) LDFLAGS = $(shell pkg-config --libs libcrypto libjwt) TARGET = sign all: $(TARGET) $(TARGET): sign.cpp $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ clean: rm -f $(TARGET)
这样不管库装在哪个路径,pkg-config都会自动帮你找到,避免路径写错的问题。
如果你的库都放在/usr/local这类非系统默认路径(很多第三方库会装在这里),可以把这些路径加到环境变量里,以后编译时系统会自动搜索:
编辑~/.bashrc文件,添加:
export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
然后运行source ~/.bashrc生效。这样你甚至可以在Makefile/CMake里去掉-I和-L的配置,更简洁。
想实现像Python那样改完代码就一键运行?写个简单的bash脚本run.sh:
#!/bin/bash make && ./sign
给脚本加执行权限:chmod +x run.sh,之后每次改完代码,只要敲./run.sh,就能自动编译并运行程序,测试起来特别顺手。如果用CMake的话,脚本可以改成:
#!/bin/bash cd build && make && cd .. && ./sign
内容的提问来源于stack exchange,提问作者RSlink Engineer

