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++默认的系统库路径下,链接器也无法定位到对应文件。
修复步骤
- 修正主程序的函数声明:将main.cpp中factorial函数的声明修改为
extern "C" __declspec(dllimport) long int factorial(int); - 重新编译DLL,同时生成导入库:执行以下命令,编译后同目录下会同时生成运行时需要的
factorial.dll和链接时需要的libfactorial.ag++ factorial.cpp -o factorial.dll -shared -Wl,--out-implib,libfactorial.a - 编译主程序时指定当前目录为库搜索路径,执行以下命令完成编译:
g++ main.cpp -o app.exe -L. -lfactorial - 运行前将
factorial.dll放到和app.exe相同的目录下,即可正常执行程序。
内容的提问来源于stack exchange,提问作者amp
相关产品推荐
相关产品推荐

