You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++20模块结合类使用时报ld返回1退出状态错误如何解决

问题概述

使用C++20模块特性结合类开发时,编译最终抛出链接错误:

collect2.exe: error: ld returned 1 exit status

当前使用的编译命令为:
g++ -std=c++20 -fmodules-ts -o main airline_ticket.cpp main.cpp

涉及两个源码文件:airline_ticket.cpp(模块定义文件)、main.cpp(主程序入口文件)。

问题根因

这个ld链接错误本质是GCC的C20模块编译机制和传统.cpp文件直接编译链接的逻辑不同:当前直接把两个源文件同时传给g的编译方式,不会提前生成模块对应的预编译单元与目标文件,链接阶段找不到airline_ticket模块导出的类符号,就会返回1退出状态。
另外代码还有一个隐藏编译错误:模块中使用了std::string,但全局模块片段仅引入了<iostream>头文件,没有引入<string>,修正编译命令后也会触发类型未定义的报错。

解决步骤
  • 调整模块文件代码,补充缺失的头文件引用
    修改airline_ticket.cpp开头的全局模块片段,加入string头文件:
module;
#include <iostream>
#include <string> // 补充std::string对应的头文件

export module airline_ticket;
// 后续AirlineTicket类定义保持原有逻辑不变

同时调整main.cpp的include顺序,将所有#include语句放在import语句之前,避免编译顺序导致的符号识别问题:

#include <iostream>
import airline_ticket;

// main函数逻辑保持不变
  • 按顺序执行编译命令
    GCC要求模块文件必须先于引用它的文件编译,分两步执行:
    • 第一步单独编译模块文件,生成预编译模块文件和目标文件:
      g++ -std=c++20 -fmodules-ts -c airline_ticket.cpp
      执行完成后目录下会生成airline_ticket.gcm(GCC模块预编译产物)和airline_ticket.o(模块目标文件)。
    • 第二步编译主程序,链接模块目标文件生成最终可执行文件:
      g++ -std=c++20 -fmodules-ts -o main main.cpp airline_ticket.o

执行完上述步骤即可正常编译运行,输出结果为160换行加800。

补充说明
  • GCC的C++20模块支持目前仍在持续迭代,-fmodules-ts参数是启用模块TS支持的开关,不同GCC版本对模块的编译要求可能有细微差异,建议使用GCC 11及以上版本测试模块特性。
  • 编译时必须保证模块文件的编译顺序在前,且.gcm文件存放在g++的模块搜索路径(默认是当前目录)下,否则会报找不到模块的编译错误。

内容的提问来源于stack exchange,提问作者Leonardopo3130

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:57:19