【问题标题】:How to install a C++ library (OpenAL)如何安装 C++ 库 (OpenAL)
【发布时间】:2020-08-20 16:20:34
【问题描述】:

我在用 C++ 安装 OpenAL 音频库时遇到了困难。我猜标题在正确的文件夹中,问题出在 lib 文件中,因为当我包含库(#include <AL/al.h>#include <AL/alc.h>)时,VS Code 没有显示任何错误,但是当我尝试编译我的代码时从终端我收到以下错误:

C:\Users\ALEXAN~1\AppData\Local\Temp\ccNZ4t3C.o:Proves.cpp:(.text+0x1c): undefined reference to `__imp_alcOpenDevice'
C:\Users\ALEXAN~1\AppData\Local\Temp\ccNZ4t3C.o:Proves.cpp:(.text+0x30): undefined reference to `__imp_alcCloseDevice'
collect2.exe: error: ld returned 1 exit status

我安装库的位置和方式:

我已经下载并解压了Windows binaries。然后我运行cpp -v 命令来查找C++ 包含目录,其中显示了3 个目录。我将AL 文件夹(包含标题)移动到C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\x86_64-w64-mingw32\include 目录和Win32 库文件(称为libOpenAL32.dll.aOpenAL32.defOpenAL32.lib)到C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\x86_64-w64-mingw32\lib 目录。我不确定是否必须将它们中的 3 个或仅称为 libOpenAL32.dll.a 的一个放在那里。

我知道在 stackoverflow 上有类似的帖子,我已经阅读了其中的一些,但这是我第一次在 C++ 中安装库,我很难理解它们。如果有人能就如何完成安装提供清晰的解释,我将不胜感激。

【问题讨论】:

  • 链接和包含标题是两个不同的东西。使编译器找到正确的头文件路径与添加到链接器以链接到库的命令是分开的。
  • 但是当我尝试从终端运行我的代码时此时你仍然没有运行你的应用程序,因为构建失败了。
  • 把它放在\lib目录还不够吗?不,绝对不行。除非您告诉它使用库,否则链接器不会在您的项目文件夹中搜索库。
  • 你必须修改你的tasks.json 像这个答案:https://stackoverflow.com/a/59600574/487892 -L 参数是库文件夹的路径。 -l 是库文件。
  • 它以.a 结尾,但你可以省略扩展名

标签: c++ visual-studio-code installation header-files openal


【解决方案1】:

感谢@drescherjm 和@MemzIcon 的this answer,我找到了解决问题的方法。我已经修改了答案中的代码,因此我可以通过将${workspaceFolder} 更改为${fileDirname} 将其用于项目中的任何文件。

此外,我创建了一个 C:\Libraries 目录,其中包含两个文件夹:Include,我将在其中存储我的外部标头,Libs,我将在其中存储我的外部库文件。这样,我安装的库就不会与其他 C++ 库混在一起。

这是我创建的第一个tasks.json

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Compiler",
            "type": "shell",
            "command": "g++",
            "args": [
                "-c",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.o",
                "-IC:\\Libraries\\Include"
            ]
        },
        {
            "label": "Linker",
            "type": "shell",
            "command": "g++",
            "args": [
                "${fileDirname}\\${fileBasenameNoExtension}.o",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-LC:\\Libraries\\Libs",
                "-llibOpenAL32"
            ]
        },
        {
            "label": "Build OpenAL",
            "dependsOn": [
                "Compiler",
                "Linker"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

但是,它不能正常工作,因为它在 <file>.o 尚未创建时执行了第二个名为“Linker”的命令。结果,当我按下Ctrl+Shift+B 快捷方式时,“链接器”命令抛出错误,因为它没有找到目标文件。为了解决这个问题,我只创建了一个命令而不是 3 个。在这个命令内部,我使用了 ; 符号来分隔编译器和链接器部分。最后,这是我tasks.json的方面:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build OpenAL",
            "type": "shell",
            "command": "g++",
            "args": [
                "-c",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.o",
                "-IC:\\Libraries\\Include",

                ";",

                "g++",
                "${fileDirname}\\${fileBasenameNoExtension}.o",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-LC:\\Libraries\\Libs",
                "-llibOpenAL32",

            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2017-03-05
    相关资源
    最近更新 更多