繁体   English   中英

G++ linker 忽略 static 库

[英]G++ linker ignores static library

包含标头,但不包含 static 库 (influxdb)。

我的 tasks.json 文件:

{
"tasks": [
    {
        "type": "shell",
        "label": "g++.exe build active file (mt)",
        "command": "C:/msys64/mingw64/bin/g++.exe",
        "args": [
            "-v",
            "-LC:/influxdb-cxx/lib",
            "-g",
            "${file}",
            "-o",
            "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "-std=c++17",
            "-lws2_32",
            "-lInfluxDB"
        ],
        "options": {
            "cwd": "C:/msys64/mingw64/bin"
        },
        "problemMatcher": [
            "$gcc"
        ]
    },
    {
        "type": "shell",
        "label": "g++.exe build active file",
        "command": "C:/msys64/mingw64/bin/g++.exe",
        "args": [
            "-g",
            "${file}",
            "-o",
            "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "-std=c++17"
        ],
        "options": {
            "cwd": "C:/msys64/mingw64/bin"
        },
        "problemMatcher": [
            "$gcc"
        ],
        "group": "build"
    }
],
"version": "2.0.0"
}

使用 -v 选项显示库路径和库名称被传递给 linker(-LC:/influxdb-cxx/lib 和 -lInfluxDB):

C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/collect2.exe -plugin C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/liblto_plugin-0.dll -plugin-opt=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\Users\Admin\AppData\Local\Temp\ccxBryht.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -m i386pep -Bdynamic -o c:/path/to/executable.exe C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/crtbegin.o -LC:/influxdb-cxx/lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0 -LC:/msys64/mingw64/bin/../lib/gcc -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../.. C:\Users\Admin\AppData\Local\Temp\ccjciO8C.o -lws2_32 -lInfluxDB -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/default-manifest.o C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/

在编译时,该库中的所有函数都出现“未定义的引用”错误。 但是 linker 并没有说找不到该文件,所以它链接了库,我猜。 该库文件包含所有函数。 我已经使用 nm 进行了检查。

我也尝试过更改链接顺序,但没有帮助。

我的系统是Windows 7,编辑器是VS code,编译器是msys2 mingw64 g++。

库路径包含在 LIB 环境变量中,头文件路径包含在 INCLUDE 中,dll 路径包含在 Path 中。

添加对-lInfluxDB的附加引用应该是命令行的末尾 我不知道如何在 tasks.json 中执行此操作。

我相信 GNU linker 只能向前解决依赖关系。 也就是说,如果库 A 依赖于 B,则-lA在命令行顺序中必须出现在-lB之前。 如果 A 和 B 相互依赖,您可以执行-lA -lB -lA阅读 this

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM