C++编译
C编译编译命令问题 修正完整编译指令一、当前编译命令存在4个致命错误1.-L参数用法错误-L后面只能跟库目录文件夹路径不能直接写.so文件。错误写法-L/opt/onnxruntime/lib/libonnxruntime.so.1.18.0正确逻辑-L/opt/onnxruntime/lib指定库搜索目录-lonnxruntime链接 libonnxruntime.so2. OpenCV 同样全部写错-L不能带so文件名3. 缺少 C17 标准ORT C API 必须加-stdc174. 库链接顺序问题opencv 库要放在源码后面否则符号找不到二、修正后完整可编译命令g Fcos3dOnnx.cpp -o Fcos3dOnnx -g -stdc17 \ -I/home/Desktop/fcos3d_deploye/thirdparty/opencv-4.13.0/install/include/opencv4 \ -I/opt/onnxruntime/include \ -L/opt/onnxruntime/lib \ -L/home/Desktop/fcos3d_deploye/thirdparty/opencv-4.13.0/install/lib \ -lonnxruntime \ -lopencv_core \ -lopencv_imgproc \ -lopencv_imgcodecs \ -lopencv_ximgproc \ -lopencv_highgui \ -lopencv_videoio \ -ldl -lnsl -lm -lpthread -lrt三、运行前动态链接库配置否则执行报找不到lib# 临时生效终端 export LD_LIBRARY_PATH/opt/onnxruntime/lib:/home/Desktop/fcos3d_deploye/thirdparty/opencv-4.13.0/install/lib:$LD_LIBRARY_PATH # 执行程序 ./Fcos3dOnnx四、补充说明-stdc17必不可少onnxruntime C 封装依赖C17特性-L仅填目录-l加库名去掉lib前缀与.so后缀链接顺序onnxruntime在前opencv在后系统库放最后编译如果报‘Ort::AllocatedStringPtr’相关语法报错确认ORT版本≥1.12。问题根源std::formatC20 标准才引入你编译器虽然开启-stdc17C17 没有 std::format所以报错format is not a member of std。两条解决方案方案A推荐兼容C17改用printf风格可变参数实现日志不依赖std::format方案B升级编译标准到-stdc20如果交叉编译器/gcc版本足够新你的日志调用形式LOG_INFO(in_obs_x {}, in_obs_y {}, in_obs_z {}, in_obs.x, in_obs.y, in_obs.z);⚠️ 注意{}是std::format占位符传统printf是%f %lf %d二者占位符语法不一样两种路线说明如果你想继续用{}占位符必须开启C20如果工程只能C17必须修改打印字符串为 % 格式或者引入第三方fmt库fmt::format方案1C17可用宏实现LOG_INFOprintf风格 %占位符日志输出时间 | [文件名:行号] | 日志内容#include iostream #include cstdio #include ctime // 取文件名剔除完整路径只保留main.cpp static constexpr const char* get_filename(const char* path) { const char* p path; for (const char* i path; *i; i) { if (*i / || *i \\) p i 1; } return p; } // 核心日志宏C17 完全兼容使用printf格式 %f %d %s #define LOG_INFO(fmt, ...) \ do { \ std::time_t now std::time(nullptr); \ char tm_buf[32]; \ std::strftime(tm_buf, sizeof(tm_buf), %Y%m%d %H:%M:%S, std::localtime(now)); \ std::printf(%s | INFO [%s:%d] fmt \n, \ tm_buf, get_filename(__FILE__), __LINE__, ##__VA_ARGS__); \ } while (0)使用方式⚠️占位符改成%// 原来 {} 写法C17不支持改成 LOG_INFO(in_obs_x %f, in_obs_y %f, in_obs_z %f, in_obs.x, in_obs.y, in_obs.z);如果你坚持想用{}格式化C17可行方案fmt库工程引入 fmtlib头文件仅需#include fmt/format.h #define LOG_INFO(fmt, ...) \ do { \ std::time_t now std::time(nullptr); \ char tm_buf[32]; \ std::strftime(tm_buf, sizeof(tm_buf), %Y%m%d %H:%M:%S, std::localtime(now)); \ std::cout fmt::format({} | INFO [{}:{}] {}\n, \ tm_buf, get_filename(__FILE__), __LINE__, fmt::format(fmt, ##__VA_ARGS__));\ } while (0)调用不变LOG_INFO(in_obs_x {}, in_obs_y {}, in_obs_z {}, in_obs.x, in_obs.y, in_obs.z);编译链接增加-lfmt方案2开启C20最简单改动但要看编译器是否支持修改CMakeLists.txt# 原来 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON)注意gcc 10aarch64交叉编译器版本不能太老才能完整支持std::format。老版本gcc即使写c20std::format依然缺失你原来报错的宏C20才能跑贴出来对照#define LOG_INFO(fmt, ...) \ do { \ std::time_t now std::time(nullptr); \ char tm_buf[32]; \ std::strftime(tm_buf, sizeof(tm_buf), %Y%m%d %H:%M:%S, std::localtime(now)); \ std::cout tm_buf | INFO [ get_filename(__FILE__) : __LINE__ ] \ std::format(fmt, ##__VA_ARGS__) \n; \ } while (0)额外踩坑提醒你当前工程场景 stixel-world ARM交叉编译嵌入式aarch64交叉编译器很多旧版本不完全支持C20 std::format大概率选【方案1 printf宏】最稳妥无第三方依赖##__VA_ARGS__是GCC扩展MSVC略有差异Linux环境没问题__FILE__会输出绝对路径我写的get_filename函数自动截取最后的文件名日志更干净如果后续需要日志分级 LOG_WARN/LOG_ERROR可以直接复制宏修改最终建议优先使用【方案1无依赖printf版本】不需要改动编译器标准C17原生支持直接替换你现有的LOG_INFO宏只需要把打印字符串{}改成%f/%d。如果你需要我可以直接给你完整可粘贴到头文件的.h版本附带头文件保护宏。C 实现 LOG_INFO 宏推荐能自动获取文件名、行号说明C 函数无法自动捕获调用处文件名、行号必须使用宏。实现效果LOG_INFO(in_obs_x {}, in_obs_y {}, in_obs_z {}, in_obs.x, in_obs.y, in_obs.z);输出示例[INFO] main.cpp:42 | in_obs_x 1.23, in_obs_y 4.56, in_obs_z 7.89方案1使用 C20std::format匹配你代码里{}格式化风格最贴合你的写法#include iostream #include format #include string // 提取文件名去掉路径只保留xxx.cpp constexpr const char* extract_filename(const char* path) { const char* p path; for (auto ptr path; *ptr; ptr) { if (*ptr / || *ptr \\) p ptr 1; } return p; } #define LOG_INFO(fmt, ...) \ do { \ std::string log_str std::format(fmt, __VA_ARGS__); \ std::cout std::format([INFO] {}:{} | {}\n, \ extract_filename(__FILE__), __LINE__, log_str); \ } while(0)如果编译器不支持 C20 std::format兼容老gcc使用 fmt 库 / printf 风格版本2printf 风格%s %f兼容所有C标准#include iostream #include cstdio constexpr const char* extract_filename(const char* path) { const char* p path; for (auto ptr path; *ptr; ptr) { if (*ptr / || *ptr \\) p ptr 1; } return p; } #define LOG_INFO(fmt, ...) \ do { \ printf([INFO] %s:%d | fmt \n, extract_filename(__FILE__), __LINE__, ##__VA_ARGS__);\ } while(0)⚠️注意这个版本格式化符号要改成%f %d不能继续用{}调用示例LOG_INFO(in_obs_x %.2f, in_obs_y %.2f, in_obs_z %.2f, in_obs.x, in_obs.y, in_obs.z);重点知识点解释__FILE__编译器内置宏当前源码完整路径字符串__LINE__编译器内置宏当前调用行号do{}while(0)标准宏封装方案避免if/for场景语法错误##__VA_ARGS__GCC扩展当可变参数为空时消除多余逗号如果你在用 glog自动驾驶项目常用你场景大概率使用如果你工程已经依赖 glog不用自己造轮子直接封装#include glog/logging.h #define LOG_INFO(fmt, ...) \ LOG(INFO) [ extract_filename(__FILE__) : __LINE__ ] \ std::format(fmt, __VA_ARGS__)扩展需求输出时间戳基于第一个C20版本增加本地时间#include iostream #include format #include string #include chrono constexpr const char* extract_filename(const char* path) { const char* p path; for (auto ptr path; *ptr; ptr) { if (*ptr / || *ptr \\) p ptr 1; } return p; } #define LOG_INFO(fmt, ...) \ do { \ auto now std::chrono::system_clock::now(); \ std::string log_str std::format(fmt, __VA_ARGS__); \ std::cout std::format([{:%Y-%m-%d %H:%M:%S}] [INFO] {}:{} | {}\n, \ now, extract_filename(__FILE__), __LINE__, log_str); \ } while(0)重要提醒你原始代码使用大括号{}占位符优先选择C20 std::format 版本交叉编译 aarch64 嵌入式平台时gcc版本 11 才能完整支持 std::format如果嵌入式编译器版本较低建议引入fmtlib第三方库API和std::format完全一致。需要我帮你改成头文件.h可直接引入、支持头文件多重保护的完整封装版本吗先梳理你所有报错一次性讲清楚根源报错1format is not a member of std你已经设置CMAKE_CXX_STANDARD 20但依然找不到std::format根本原因GCC 版本 13libstdc 不完全实现 std::format很多交叉编译器aarch64-linux-gnu-gcc 10/11/12即使开启-stdc20std::format 仍然未实现。这是标准库缺失不是CMake参数问题。报错2expected primary-expression before ) token当LOG_INFO(GODService Start...);没有可变参数LOG_INFO(GODService Start...); // 宏展开后std::format(fmt, ) 逗号后面空了 → 语法报错你旧宏没有处理空参数GCC扩展##__VA_ARGS__缺失。报错3std::this_thread has not been declared缺少头文件#include thread #include chrono最优解决方案立刻可用不依赖std::formatC17/C20通用无第三方库彻底抛弃std::format重写LOG_INFO宏使用原生printf风格不再触发format相关报错⚠️ 注意调用时{}占位符要改为%f %d %s完整代码直接替换#include iostream #include cstdio #include ctime #include thread // 修复std::this_thread报错 #include chrono // 截取文件名去掉完整路径 constexpr const char* extract_filename(const char* path) { const char* name path; for (const char* p path; *p; p) { if (*p / || *p \\) name p 1; } return name; } // 日志宏 GCC Linux 可用##__VA_ARGS__ 自动处理无参数场景 #define LOG_INFO(fmt, ...) \ do { \ char time_buf[32] {0}; \ std::time_t now std::time(nullptr); \ std::strftime(time_buf, sizeof(time_buf), %Y%m%d %H:%M:%S, std::localtime(now)); \ std::printf(%s | INFO [%s:%d] fmt \n, \ time_buf, extract_filename(__FILE__), __LINE__, ##__VA_ARGS__); \ } while(0)使用示例// 单个字符串无额外参数不会报错 LOG_INFO(GODService Start...); // 浮点打印 LOG_INFO(in_obs_x %f, in_obs_y %f, in_obs_z %f, in_obs.x, in_obs.y, in_obs.z);临时修复你 sleep_for 报错在main.cpp头部加上#include thread #include chrono如果你坚持想用 {} 占位符不想改打印字符串只能引入 fmt 库fmt::format不要依赖标准库std::format拉取 fmtlib https://github.com/fmtlib/fmtCMake 链接 fmt宏改成#include fmt/format.h #define LOG_INFO(fmt, ...) \ do { \ char time_buf[32] {0}; \ std::time_t now std::time(nullptr); \ std::strftime(time_buf, sizeof(time_buf), %Y%m%d %H:%M:%S, std::localtime(now)); \ std::cout fmt::format({} | INFO [{}:{}] {}\n, \ time_buf, extract_filename(__FILE__), __LINE__, fmt::format(fmt, ##__VA_ARGS__)); \ } while(0)重点说明为什么你设置C20依然失败set(CMAKE_CXX_STANDARD 20)只是告诉编译器启用C20语法不代表标准库完整支持GCC 12 及以下std::format未实现GCC 13完整支持 std::format查看你的编译器版本aarch64-linux-gnu-g -v交叉编译嵌入式SOCvs919平台编译器一般比较老不要指望std::format能用优先使用上面printf版本快速落地操作步骤删除你原来带std::format的LOG_INFO宏粘贴上面printf版本宏添加头文件thread chrono把所有LOG_INFO(xxx {})修改为LOG_INFO(xxx %f)重新编译三类报错全部消失如果你想要我可以把宏封装成独立logger.h头文件带头文件保护直接include使用。

相关新闻

Xenos:终极Windows DLL注入器深度解析与5种注入模式实战指南

Xenos:终极Windows DLL注入器深度解析与5种注入模式实战指南

Xenos:终极Windows DLL注入器深度解析与5种注入模式实战指南 【免费下载链接】Xenos Windows dll injector 项目地址: https://gitcode.com/gh_mirrors/xe/Xenos Xenos是一款基于Blackbone库构建的高级Windows DLL注入器,专为开发者和安全研究人员…

2026/8/13 0:14:20 阅读更多 →
从零解读企业级STM32项目:模块化、双核通信与实战架构解析

从零解读企业级STM32项目:模块化、双核通信与实战架构解析

很多开发者都有这样的困惑:看懂了STM32的HAL库例程,也跑通了几个开发板上的小实验,但面对一个真实的企业级项目代码时,却感觉无从下手。那些复杂的目录结构、层层嵌套的宏定义、分散在不同文件的配置,以及各种看似“多…

2026/8/11 12:48:09 阅读更多 →
ncmdump解密工具:3步解锁网易云音乐NCM格式限制,重获音乐自由

ncmdump解密工具:3步解锁网易云音乐NCM格式限制,重获音乐自由

ncmdump解密工具:3步解锁网易云音乐NCM格式限制,重获音乐自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否遇到过这样的困境:在网易云音乐下载的歌曲只能在特定APP播放,无法在…

2026/8/13 0:02:04 阅读更多 →

最新新闻

网站建设挣钱么:揭秘个人与工作室如何在红海中杀出一条血路并实现月入过万的真实路径

网站建设挣钱么:揭秘个人与工作室如何在红海中杀出一条血路并实现月入过万的真实路径

在这个数字化狂飙突进的时代,很多人都在问同一个问题:网站建设挣钱么?听起来似乎是个老生常谈的话题,毕竟互联网普及这么多年,建站的需求早已不像十年前那样稀缺。当你刷着短视频,看着那些光鲜亮丽的“自由职业者”晒出收款截图时,心里难免会有一丝波动,既想尝试又怕踩…

2026/8/13 0:41:30 阅读更多 →
地铁采风111

地铁采风111

2026/8/13 0:41:30 阅读更多 →
llama.cpp 本地部署完全指南:从安装到 OpenAI 兼容 API 服务

llama.cpp 本地部署完全指南:从安装到 OpenAI 兼容 API 服务

发布日期:2026-08-12 | 数据来源:llama.cpp 官方 GitHub(ggml-org/llama.cpp)文档、官方 install.md / build.md / server 文档 | 话题:llama.cpp 本地大模型 GGUF llama-server llama.cpp 是由 Georgi Gerganov 开…

2026/8/13 0:40:30 阅读更多 →
Linux 内核日志诊断:dmesg 命令完整详解(硬件故障排查实战)

Linux 内核日志诊断:dmesg 命令完整详解(硬件故障排查实战)

1. 命令简介 dmesg 命令是 Linux 系统中一个核心的诊断工具,用于显示和控制内核环形缓冲区的内容。内核在启动和运行过程中,会将硬件检测、设备驱动初始化、系统错误等重要信息实时写入此环形缓冲区。 通过 dmesg,系统管理员和开发者可以&a…

2026/8/13 0:39:29 阅读更多 →
Bash 脚本进阶:declare 命令完整详解(变量属性、数组、只读实战)

Bash 脚本进阶:declare 命令完整详解(变量属性、数组、只读实战)

1. 命令简介 declare 是 Bash 内建命令,用于声明、设置或显示变量的值和属性。它可以创建具有特定属性(如只读、整型、数组等)的变量,也可以显示现有变量的属性和值。该命令在脚本编程中常用于精确控制变量的行为。 2. 语法格式…

2026/8/13 0:39:29 阅读更多 →
深入了解佛山网站建设明细报价逻辑与服务标准

深入了解佛山网站建设明细报价逻辑与服务标准

做网站和做房子其实是一个道理,很多人以为把钢筋水泥堆起来就能住人,结果住进去才发现漏水、隔音差、格局还反人类。做网站也一样,很多老板一开始只看最后那个漂亮的界面,却忽略了地基打得好不好,管线排得顺不顺。作为深耕佛山本地多年的网络技术人员,我见过太多因为前期…

2026/8/13 0:37:27 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →