WSL下g++编译BSPLib示例报main函数声明冲突错误
问题描述
在Windows系统的VS Code中借助WSL配置BSPLib过程中,编译测试代码时抛出如下错误:
test.cpp:4:5: error: conflicting declaration of C function ‘int main()’ 4 | int main() | ^~~~ In file included from /mnt/d/study/software/bsp/include/bsp/bspExt.h:30, from /mnt/d/study/software/bsp/include/bsp/bsp.h:34, from test.cpp:2: /mnt/d/study/software/bsp/include/bsp/bspClass.h:59:12: note: previous declaration ‘int main(int, char**)’ 59 | extern int main(int argc, char **argv);
使用的测试代码如下:
#include <iostream> #include "bsp/bsp.h" int main() { bsp_begin(bsp_nprocs()); int s = bsp_pid(); int p = bsp_nprocs(); printf("Hello World from processor %d / %d", s, p); bsp_end(); return 0; }
使用的编译命令为:
g++ -I/mnt/d/study/software/bsp/include -g -lpthread -o main test.cpp
已完成的配置操作:
- 从项目仓库复制了所需的头文件
- 编译时通过
-I参数添加头文件搜索路径,按照课程脚本要求添加了-lpthread链接参数 - 在
c_cpp_properties.json配置文件中添加了头文件路径(已测试添加/不添加该配置,编译结果无差异)
错误原因
- 函数签名不匹配:BSPLib的头文件
bspClass.h中通过extern声明了入口函数签名为int main(int argc, char** argv),而测试代码中写的是无参int main(),C/C++中参数列表不同的函数属于不同签名,编译器会判定为冲突声明。
注意:extern仅标识函数为外部链接属性,不会自动适配函数签名,只要声明和定义的参数列表、返回值不匹配,就会触发编译错误 - 库文件缺失:仅复制头文件没有编译BSPLib的源码生成对应的静态/动态库,即使修复签名问题,后续也会抛出链接错误。
修复方案
- 修改测试代码的main函数签名,与头文件声明保持一致,同时补充BSP初始化必需的
bsp_init调用,修正后的代码如下:
#include <cstdio> #include "bsp/bsp.h" int main(int argc, char** argv) { bsp_init(bsp_begin, argc, argv); bsp_begin(bsp_nprocs()); int s = bsp_pid(); int p = bsp_nprocs(); printf("Hello World from processor %d / %d\n", s, p); bsp_end(); return 0; }
- 完整拉取BSPLib源码,按照项目说明编译生成对应的库文件(通常为
libbsp.a或libbsp.so)。 - 修正编译命令,补充库文件搜索路径和BSP库链接参数,注意链接参数顺序需放在源文件之后:
g++ -I/mnt/d/study/software/bsp/include -L/mnt/d/study/software/bsp/lib -g -o main test.cpp -lbsp -lpthread
其中-L后面的路径替换为本地编译生成的BSP库文件所在目录。
内容的提问来源于stack exchange,提问作者user18838058
相关产品推荐
相关产品推荐

