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

C++构建DLL编译主程序时出现ld returned 1 exit status报错

问题描述

学习C++ DLL开发过程中,完成DLL代码编写后编译主cpp文件时出现如下报错:

ld.exe: cannot find -lfactorial
collect2.exe: error: ld returned 1 exit status

注:报错原文写为id.exe属于输入笔误,实际为MinGW平台的链接器ld.exe

已使用的代码与编译命令

  • DLL源文件 factorial.cpp 代码:
extern "C" __declspec(dllexport) long int factorial(int);
extern "C" __declspec(dllexport)
long int factorial( int n ){
    if( n > 1 )
        return n * factorial( n - 1 );
    else return 1;
}
  • 原有DLL编译命令:
    g++ factorial.cpp -o factorial.dll -shared
  • 主程序源文件 main.cpp 代码:
#include <iostream>
using namespace std;
extern "C" __declspec(dllexport) long int factorial(int);
int main(){
    int n;
    cout<<"Enter n: ";
    cin>>n;
    system("cls");
    cout<<"Factorial "<<n<<" = "<<factorial(n);
    return 0;
}
  • 原有主程序编译命令:
    g++ main.cpp -o app.exe -lfactorial
问题根因
  • 编译DLL时未生成对应导入库:MinGW环境下g++编译DLL时,默认仅输出dll文件,不会自动生成链接阶段需要的lib<库名>.a格式导入库。-lfactorial参数会默认查找名为libfactorial.a的库文件,文件不存在时直接触发找不到库的报错。
  • 主程序函数声明修饰符错误:主程序作为DLL的调用方,引用DLL导出函数时需要使用__declspec(dllimport)标记,原有代码误用了用于导出函数的__declspec(dllexport),会导致链接逻辑异常。
  • 未指定库搜索路径:即使导入库文件存在,如果存放在当前项目目录而非g++默认的系统库路径下,链接器也无法定位到对应文件。
修复步骤
  1. 修正主程序的函数声明:将main.cpp中factorial函数的声明修改为
    extern "C" __declspec(dllimport) long int factorial(int);
    
  2. 重新编译DLL,同时生成导入库:执行以下命令,编译后同目录下会同时生成运行时需要的factorial.dll和链接时需要的libfactorial.a
    g++ factorial.cpp -o factorial.dll -shared -Wl,--out-implib,libfactorial.a
    
  3. 编译主程序时指定当前目录为库搜索路径,执行以下命令完成编译:
    g++ main.cpp -o app.exe -L. -lfactorial
    
  4. 运行前将factorial.dll放到和app.exe相同的目录下,即可正常执行程序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:18:25