Линкер G ++ игнорирует статическую библиотеку - PullRequest
0 голосов
/ 07 октября 2019

Заголовки включены, но статическая библиотека (influenxdb) отсутствует.

Файл My 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 показывает, что путь к библиотеке и имя библиотеки передаются вкомпоновщик (-LC: / influenxdb-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/

При компиляции я получаю ошибку «неопределенная ссылка» для всех функций из этой библиотеки. Но компоновщик не говорит, что файл не найден, поэтому он связывает библиотеку, я думаю. Этот файл библиотеки содержит все функции. Я проверил это, используя nm.

Я также пытался изменить порядок связывания, но это не помогло.

Моя система - Windows 7, редактор - VS code, компилятор - msys2 mingw64 g ++.

Путь к библиотеке включен в переменную среды LIB, путь к заголовкам включен в INCLUDE, а путь к DLL включен в Path.

1 Ответ

0 голосов
/ 08 октября 2019

Добавьте дополнительную ссылку на -lInfluxDB в качестве end командной строки. Я не знаю, как это сделать в tasks.json.

Я считаю, что компоновщик GNU только вперед разрешает зависимости. То есть, если библиотека A зависит от B, то -lA должно стоять перед -lB в порядке командной строки. Если и A, и B зависят друг от друга, вы можете -lA -lB -lA или прочитать это .

...