淘先锋技术网

首页 1 2 3 4 5 6 7

ld returned exit code 1可能原因

错误如下:
在这里插入图片描述
在terminal中提示:ld returned exit code 1。这个ld returned exit code 1应该是链接出错,在shell脚本里执行man ld可以发现ld实际上是一个GNU linker,所以猜测应该是链接出错,也就是执行的程序需要一些静态库(*.a)或者动态库(*.so),但是编译的时候并没有正确链接它们。

  1. 首先需要检查cmakelists.txt是否加入了相关库
find_package(第三方库)
target_link_libraries(可执行程序名称 静态库/动态库)
  1. 如果正确引入了库,并且在系统的terminal中可以通过在build目录下使用命令cmake .. && make正确编译,但是在vscode中仍然出现以上错误,说明cmake项目配置是没有问题的,那么问题出在vscode的launch.json与tasks.json配置上。

vscode下编辑launch.json与tasks.json以调试cmake项目

(当然首先需要安装了cmake插件以及c++语言支持)
1. 写好了cmake项目的cmakelists.txt与相应的代码之后,按F5调试程序,选择第一个(如果已存在launch.json可以先把launch.json删除,或者删除整个.vscode目录)
在这里插入图片描述
2. 然后选择g++生成和调试活动文件
在这里插入图片描述
3. 会生成一个默认的launch.json文件,在该文件中把program参数改成可执行文件名称。这个launch.json实际上就是指定debug时候调试的目标程序
json "program": "${workspaceFolder}/build/可执行文件名称",
4. 然后把launch.json里的preLaunchTask参数改成如下(原先是C/C++: g++ build active file。这个参数含义是在调试上面指定的program之前执行的任务(一般是编译、链接),而这里默认的c++ build active file任务可能是按照makefiles使用g++进行编译,但是如果cmakelists.txt中引入了新的库,但是makefiles没有变(需要执行cmake才会改变makefiles内容),所以会出现链接错误;所以这里更改该任务按照常规的cmake&&make操作来编译而不使用makefiles来
json "preLaunchTask": "build",
5. 改完launch.json文件后,按F5启动调试会提示不存在build这个任务,configure Task,然后从模板创建tasks.json,选择其他:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6. 然后在生成的tasks.json文件里,更改label为build(也就是launch.json里设定的任务名称),更改command为cmake和make命令。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "cd ${workspaceFolder}/build && cmake .. && make -j8"
        }
    ]
}
  1. 经过以上设置launch.json和tasks.json,则每次按F5调试时都相当于进入build目录下执行cmake ..make完成编译然后才使用gdb调试生成的程序。另外需要注意的是tasks.json里的命令并没有创建build目录,所以要先在项目目录下创建build子目录,然后F5才有效