【问题标题】:VS Code Error: cannot specify -o when generating multiple output filesVS 代码错误:生成多个输出文件时无法指定 -o
【发布时间】:2021-07-27 14:43:26
【问题描述】:

我是 VS Code 和 C 的血腥初学者(实际上我一无所知)。但我有一个目标。我希望 - 有一天 - 能够从 IAU SOFA 编译 C 文件。但在我必须学习如何编译之前。为此,我将 Mac clang 编译器安装到 VS Code 中(我现在也可以将其用于 Python)。我创建了四个简单的文件:hellocopy.c、hello.c、myheader.h 和 tasks.json。我告诉 VS Code 用 shift 命令 B 编译。

我得到了错误:

开始构建... /usr/bin/clang -g /Users/widmerhans/projects/Eigene_C_Programme/*.c /Users/widmerhans/projects/Eigene_C_Programme/Myheader/*.h -o /Users/widmerhans/projects/Eigene_C_Programme/hellocopy clang:错误: 生成多个输出文件时不能指定-o 构建完成 有错误。终端进程启动失败(退出代码:-1)。

hellocopy.c:

#include <stdio.h>
#include "myheader.h"

int main(){
    int age;
    printf("Enter age\n");
    scanf("%d", &age);
    printf("age is %d", age);
    hello();
    return 0;
}

hello.c:

#include <stdio.h>
#include "myheader.h"

void hallo()  {
    printf("Hallo World\n");
}

myheader.h:

#ifndef MYHEADER_H
#define MYHEADER_H

#define PI (3.1416)

// extern int meineVariable;

// extern int meineFunktion1(int);
// extern int meineFunktion2(char);

extern void hello();

#endif /* MYHEADER_H */

tasks.json:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: clang build C files",
            "command": "/usr/bin/clang",
            "args": [
                "-g",
                "${fileDirname}/*.c",
                "${fileDirname}/Myheader/*.h",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        
        }
    ]
}

感谢您的帮助。 最好的祝福 汉斯

【问题讨论】:

  • 编辑帖子时,您可以使用{} 图标将某些部分格式化为代码示例。
  • 关于 VS Code 中的多文件编译,我的建议是毕业到构建系统。 Makefile 支持现在是原生的,还有 CMake 或 meson 或其他。然后,您可以依靠构建系统的扩展来完成繁重的工作。

标签: c visual-studio-code


【解决方案1】:

不要将头文件添加到编译器参数中。如果添加头文件,编译器会构建预编译头文件,从而为每个头文件获取多个额外的输出文件,但 -o 指定单个输出文件。

从“args”中删除该行

"${fileDirname}/Myheader/*.h"

【讨论】:

  • 感谢您的回答。我现在将所有文件放在一个目录中,并按照您的说明删除了代码行。现在我得到了错误:架构 x86_64 的未定义符号:“_hello”,引用自:_main in hellocopy-0e0359.o
  • 你没有定义函数“hello”,你定义了另一个函数“hallo”。
  • 非常感谢 S.M.!我的英语也很差。这是德语和英语之间的不匹配。哇,你确实看到了。谢谢,太好了。汉斯
【解决方案2】:

如果我是你,我会在 VS Code 中下载并使用 CMake 扩展。您还必须下载 CMake。然后像这样设置你的文件夹:

/project /* whatever you name it, home of CMakeLists.txt */
/project/build /* this is where you executable will be */
/project/include /*headers go in here */
/project/src /*source files go in here */

然后将其用作您的 CMakeLists.txt 文件...

// cmake_minimum_required(VERSION 3.20.3)
// project(TEMPLATE VERSION 0.1.0 LANGUAGES C)
// set(CMAKE_C_STANDARD 11)
// set(CMAKE_C_STANDARD_REQUIRED ON)
// set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
// include_directories(include)
// file(GLOB SOURCES "src/*.c")
// add_compile_options(-Wall -Werror -Wextra -Wpedantic)
// add_executable(TEMPLATE ${SOURCES})
// install(TARGETS TEMPLATE RUNTIME DESTINATION bin)

只需将 CMake 版本更改为您下载到系统上的版本,然后将单词 TEMPLATE 更改为您想要为项目命名的任何名称(进行 3 次更改)。

通过这种方式 CMake 为您管理一切,您可以专注于学习 C 语言。安装 CMake 扩展和 CMake 本身后,您可以使用 ctrl shift p 并键入 CMake 访问 VS Code 中的 CMake 命令,即: ctrl f5 运行调试等。

这就是我让项目进行的工作,当然您可以随着项目的增长而修改 CMakeLists.txt 文件,但这可以让项目继续进行,并可以在 Vim 中使用 YouCompleteMe,或者您想使用的任何支持的 IDE CMake(我使用 KDevelop 和 Vim)。这是 Linux 上 VS Code 中的 CMake 资源:https://code.visualstudio.com/docs/cpp/cmake-linux

注意:我必须使用 cmets 在此处发布 CMakeLists.txt 文件的内容,我不会在此处发布太多答案,因为我不是 C 程序员,只是一个业余爱好者。但这就是我所做的,它让我编码......

编辑:哦,我想我应该补充一下——如果你这样做,你不必担心维护 VS Code 生成的各种 .JSON 文件,一切都通过 CMakeLists.txt 文件完成。

【讨论】:

  • LEF,感谢您对 CMake 的解释。我想现在我敢于按照你的建议去做。我确实读过 CMake,但我认为对于像我这样的新手来说太复杂了。问候,汉斯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多