Почему этот проект C ++ не может быть собран даже тогда, когда соответствующий .lib связан? - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь собрать пример кода из Actian Btrieve (https://docs.actian.com/psql/btrieve2v13/html/btest_8cpp-example.html)

Это не будет построено, поэтому я упростил код до следующего, просто чтобы получить это работает.

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdint.h>
#include "btrieveCpp.h"
#include <iostream>

int
main(int argc, char *argv[])
{
   Btrieve::StatusCode status = Btrieve::STATUS_CODE_UNKNOWN;
   std::cout << Btrieve::MAXIMUM_RECORD_LENGTH << std::endl;
   //BtrieveFile btrieveFile;
   std::cout << "test" << std::endl << status;
   return 0;
}

Этот код успешно создается и работает. Библиотеки статически связаны, и компилятор находит заголовочный файл btrieve Cpp .h, потому что я включил его в путь поиска.

Команда сборки выглядит следующим образом (разрывы просто так, что вы можете их прочитать проще):

    mingw32-g++.exe -Wall -fexceptions -g 
-IC:\Dev\Actian\Zen-SDK-Btrieve2API-Windows-noarch-14.00.046.000\include -c 
C:\Dev\C++\Btrieve1\btest.cpp -o obj\Debug\btest.o

    mingw32-g++.exe  -o bin\Debug\Btrieve1.exe obj\Debug\btest.o  -static

Вывод программы

Вывод программы выглядит следующим образом:

program output

Проблема

Однако, если я раскомментирую строку BtrieveFile, то при сборке получаю ошибки, которые выглядят следующим образом:

build errors

Использование Code :: Blocks IDE

Я использую IDE Code :: Blocks, и когда я щелкаю правой кнопкой мыши элемент BtrieveFile и выбираю Найдите объявление, затем IDE перенесет меня в файл .H, чтобы узнать, где определен элемент.

find definition

Кроме того, имейте в виду, что другие там также определен элемент (Btrieve::MAXIMUM_RECORD_LENGTH) (btrieve Cpp .h), но он собирается без ошибок.

Вот где он находится в файле .H:

btrieve file

То, что я пытался

Я думал, что это потому, что для этого нужны определения, предоставленные. файл lib, поэтому я добавил соответствующий .lib, чтобы компоновщик нашел его и статически связал его.

Я добавил файл lib как зависимость:

dependency link

После этого я попытался снова собрать, но все равно не получилось.

Журнал сборки выглядит следующим образом: Вы можете видеть, что .lib сейчас связан.

-------- Сборка: отладка в Btrieve1 (компилятор: GNU G CC Compiler) ---------------

mingw32 -g ++. exe -Wall -fexceptions -g -I C: \ Dev \ Actian \ Zen-SDK-Btrieve2API- Windows -noarch-14.00.046.000 \ include - c C: \ Dev \ C ++ \ Btrieve1 \ btest. cpp -o obj \ Debug \ btest.o
mingw32-g ++. Exe -o bin \ Debug \ Btrieve1.exe obj \ Debug \ btest.o -stati c C: \ Dev \ Actian \ Zen-SDK-Btrieve2API- Windows -noarch-14.00.046.000 \ win32 \ x86 \ btrieve Cpp .lib
c: / devt ools / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../../../../ mingw32 / bin / ld.exe:
obj \ Debug \ btest.o: в функции `main ':
C: / Dev / C ++ / Btrieve1 / btest. cpp: 13: неопределенная ссылка на' BtrieveFile :: BtrieveFile () '
c: / devtools / mingw /bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe:
C: / Dev / C ++ / Btrieve1 / btest. cpp: 13: неопределенная ссылка на 'BtrieveFile :: ~ BtrieveFile ()'
c: / devtools / mingw / bin /../ lib / gcc / mingw32 / 8.2.0 /../ ../../../mingw32/bin/ld.exe:
C: //Dev/C++/Btrieve1/btest.cpp: 13: неопределенная ссылка на 'BtrieveFile :: ~ BtrieveFile ( ) '
collect2.exe: ошибка: ld вернул 1 состояние выхода
Процесс завершен со статусом 1 (0 минут, 2 секунд) 4 ошибок, 0 предупреждений (0) минут (ы), 2 секунд (ы)

Вы случайно не знаете, что мне не хватает? Или что мне нужно сделать, чтобы решить эту проблему?

РЕДАКТИРОВАТЬ - Изменение связи

В btrieve C .h (включен btrieve Cpp .h) там это действительно блок, подобный следующему:

#ifndef LINKAGE
    #ifdef __GNUC__
        #define LINKAGE
    #else
        #define LINKAGE __declspec(dllimport)
    #endif
#endif

Однако, если сделать переключатель так, чтобы использовался #define LINKAGE __declspec(dllimport), а затем построить, я вижу следующие ошибки (ниже)

Обратите внимание, что теперь имена выводятся на выход?

cdeclspec

Редактировать 2-нм выход btrieve Cpp .lib

nm -C C:\Dev\Actian\Zen-SDK-Btrieve2API-Windows-noarch-14.00.046.000\win32\x86\btrieveCpp.lib | findstr /I BtrieveFile
00000000 T ??0BtrieveFile@@IAE@PAUbtrieve_file@@@Z
00000000 I _imp_??0BtrieveFile@@IAE@PAUbtrieve_file@@@Z
00000000 T ??0BtrieveFile@@QAE@XZ
00000000 I _imp_??0BtrieveFile@@QAE@XZ
00000000 T ??0BtrieveFileAttributes@@QAE@XZ
00000000 I _imp_??0BtrieveFileAttributes@@QAE@XZ
00000000 T ??0BtrieveFileInformation@@QAE@XZ
00000000 I _imp_??0BtrieveFileInformation@@QAE@XZ
00000000 T ??1BtrieveFile@@QAE@XZ
00000000 I _imp_??1BtrieveFile@@QAE@XZ
00000000 T ??1BtrieveFileAttributes@@QAE@XZ
00000000 I _imp_??1BtrieveFileAttributes@@QAE@XZ
00000000 T ??1BtrieveFileInformation@@QAE@XZ
00000000 I _imp_??1BtrieveFileInformation@@QAE@XZ
00000000 T ??4BtrieveFile@@QAEAAV0@ABV0@@Z
00000000 I _imp_??4BtrieveFile@@QAEAAV0@ABV0@@Z
00000000 T ??4BtrieveFileAttributes@@QAEAAV0@ABV0@@Z
00000000 I _imp_??4BtrieveFileAttributes@@QAEAAV0@ABV0@@Z
00000000 T ??4BtrieveFileInformation@@QAEAAV0@ABV0@@Z
00000000 I _imp_??4BtrieveFileInformation@@QAEAAV0@ABV0@@Z
00000000 T ?BulkCreate@BtrieveFile@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveBulkCreatePayload@@PAVBtrieveBulkCreateResult@@@Z
00000000 I _imp_?BulkCreate@BtrieveFile@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveBulkCreatePayload@@PAVBtrieveBulkCreateResult@@@Z
00000000 T ?BulkRetrieveNext@BtrieveFile@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveBulkRetrieveAttributes@@PAVBtrieveBulkRetrieveResult@@W4LockMode@3@@Z
00000000 I _imp_?BulkRetrieveNext@BtrieveFile@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveBulkRetrieveAttributes@@PAVBtrieveBulkRetrieveResult@@W4LockMode@3@@Z
00000000 T ?BulkRetrievePrevious@BtrieveFile@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveBulkRetrieveAttributes@@PAVBtrieveBulkRetrieveResult@@W4LockMode@3@@Z
00000000 I _imp_?BulkRetrievePrevious@BtrieveFile@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveBulkRetrieveAttributes@@PAVBtrieveBulkRetrieveResult@@W4LockMode@3@@Z
00000000 T ?FileClose@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFile@@@Z
00000000 I _imp_?FileClose@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFile@@@Z
00000000 T ?FileCreate@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFileAttributes@@PAVBtrieveIndexAttributes@@PBDW4CreateMode@3@W4LocationMode@3@@Z
00000000 I _imp_?FileCreate@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFileAttributes@@PAVBtrieveIndexAttributes@@PBDW4CreateMode@3@W4LocationMode@3@@Z
00000000 T ?FileCreate@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFileAttributes@@PAVBtrieveIndexAttributes@@PB_WW4CreateMode@3@W4LocationMode@3@@Z
00000000 I _imp_?FileCreate@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFileAttributes@@PAVBtrieveIndexAttributes@@PB_WW4CreateMode@3@W4LocationMode@3@@Z
00000000 T ?FileCreate@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFileAttributes@@PBDW4CreateMode@3@W4LocationMode@3@@Z
00000000 I _imp_?FileCreate@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFileAttributes@@PBDW4CreateMode@3@W4LocationMode@3@@Z
00000000 T ?FileCreate@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFileAttributes@@PB_WW4CreateMode@3@W4LocationMode@3@@Z
00000000 I _imp_?FileCreate@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFileAttributes@@PB_WW4CreateMode@3@W4LocationMode@3@@Z
00000000 T ?FileOpen@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFile@@PBD1W4OpenMode@3@W4LocationMode@3@@Z
00000000 I _imp_?FileOpen@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFile@@PBD1W4OpenMode@3@W4LocationMode@3@@Z
00000000 T ?FileOpen@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFile@@PB_WPBDW4OpenMode@3@W4LocationMode@3@@Z
00000000 I _imp_?FileOpen@BtrieveClient@@QAE?AW4StatusCode@Btrieve@@PAVBtrieveFile@@PB_WPBDW4OpenMode@3@W4LocationMode@3@@Z
00000000 T ?GetBalancedIndexes@BtrieveFileInformation@@QAEHXZ
00000000 I _imp_?GetBalancedIndexes@BtrieveFileInformation@@QAEHXZ
00000000 T ?GetBtrieveFile@BtrieveCollection@@IAEPAVBtrieveFile@@XZ
00000000 I _imp_?GetBtrieveFile@BtrieveCollection@@IAEPAVBtrieveFile@@XZ
00000000 T ?GetBtrieveFile@BtrieveFile@@IAEPAUbtrieve_file@@XZ
00000000 I _imp_?GetBtrieveFile@BtrieveFile@@IAEPAUbtrieve_file@@XZ
00000000 T ?GetBtrieveFileAttributes@BtrieveFileAttributes@@IAEPAUbtrieve_file_attributes@@XZ
00000000 I _imp_?GetBtrieveFileAttributes@BtrieveFileAttributes@@IAEPAUbtrieve_file_attributes@@XZ
00000000 T ?GetBtrieveFileInformation@BtrieveFileInformation@@IAEPAUbtrieve_file_information@@XZ
00000000 I _imp_?GetBtrieveFileInformation@BtrieveFileInformation@@IAEPAUbtrieve_file_information@@XZ
00000000 T ?GetBtrieveFilePtr@BtrieveFile@@IAEPAPAUbtrieve_file@@XZ
00000000 I _imp_?GetBtrieveFilePtr@BtrieveFile@@IAEPAPAUbtrieve_file@@XZ
00000000 T ?GetClientTransactions@BtrieveFileInformation@@QAEHXZ
00000000 I _imp_?GetClientTransactions@BtrieveFileInformation@@QAEHXZ
00000000 T ?GetContinuousOperation@BtrieveFileInformation@@QAEHXZ
00000000 I _imp_?GetContinuousOperation@BtrieveFileInformation@@QAEHXZ
00000000 T ?GetCursorPosition@BtrieveFile@@QAE_JXZ
00000000 I _imp_?GetCursorPosition@BtrieveFile@@QAE_JXZ
00000000 T ?GetDuplicateRecordConflictCursorPosition@BtrieveFileInformation@@QAE_JXZ
00000000 I _imp_?GetDuplicateRecordConflictCursorPosition@BtrieveFileInformation@@QAE_JXZ
00000000 T ?GetDuplicateRecordConflictIndex@BtrieveFileInformation@@QAE?AW4Index@Btrieve@@XZ
00000000 I _imp_?GetDuplicateRecordConflictIndex@BtrieveFileInformation@@QAE?AW4Index@Btrieve@@XZ
00000000 T ?GetExplicitLocks@BtrieveFileInformation@@QAEHXZ
00000000 I _imp_?GetExplicitLocks@BtrieveFileInformation@@QAEHXZ
00000000 T ?GetFileVersion@BtrieveFileInformation@@QAE?AW4FileVersion@Btrieve@@XZ
00000000 I _imp_?GetFileVersion@BtrieveFileInformation@@QAE?AW4FileVersion@Btrieve@@XZ
00000000 T ?GetFixedRecordLength@BtrieveFileInformation@@QAEHXZ
00000000 I _imp_?GetFixedRecordLength@BtrieveFileInformation@@QAEHXZ
00000000 T ?GetFreeSpaceThreshold@BtrieveFileInformation@@QAE?AW4FreeSpaceThreshold@Btrieve@@XZ
00000000 I _imp_?GetFreeSpaceThreshold@BtrieveFileInformation@@QAE?AW4FreeSpaceThreshold@Btrieve@@XZ
00000000 T ?GetGatewayMajorVersion@BtrieveFileInformation@@QAEHXZ
00000000 I _imp_?GetGatewayMajorVersion@BtrieveFileInformation@@QAEHXZ
00000000 T ?GetGatewayMinorVersion@BtrieveFileInformation@@QAEHXZ
00000000 I _imp_?GetGatewayMinorVersion@BtrieveFileInformation@@QAEHXZ
00000000 T ?GetGatewayName@BtrieveFileInformation@@QAE?AW4StatusCode@Btrieve@@PADH@Z
00000000 I _imp_?GetGatewayName@BtrieveFileInformation@@QAE?AW4StatusCode@Btrieve@@PADH@Z
00000000 T ?GetGatewayName@BtrieveFileInformation@@QAEPBDXZ
00000000 I _imp_?GetGatewayName@BtrieveFileInformation@@QAEPBDXZ
00000000 T ?GetGatewayPatchLevel@BtrieveFileInformation@@QAEHXZ
00000000 I _imp_?GetGatewayPatchLevel@BtrieveFileInformation@@QAEHXZ
00000000 T ?GetGatewayPlatform@BtrieveFileInformation@@QAEHXZ
00000000 I _imp_?GetGatewayPlatform@BtrieveFileInformation@@QAEHXZ
00000000 T ?GetHandleCount@BtrieveFileInformation@@QAEHXZ

1 Ответ

2 голосов
/ 10 января 2020

Замечу, что объявление класса имеет: class LINKAGE BtrieveFile. Правильно ли определен символ LINKAGE в вашей сборке - вероятно, он должен стать __declspec(import) (ср. документы ), поскольку вы используете библиотеки Windows, даже если вы собираете с помощью g cc via mingw.

Возможно, в заголовках Btrieve есть блок, для которого есть ifdef s. Найдите это, определите правильный символ для всего проекта, и тогда вы должны правильно импортировать символы. Тогда вам просто нужно убедиться, что DLL находится в каталоге вашего EXE-файла или пути поиска, чтобы запустить EXE-файл.


Обновление:

Увы, возможно, возникли ваши новые проблемы покажите, что вы не можете делать то, что хотите, потому что библиотека была построена с другим компилятором. См. Функциональная совместимость MinGW библиотек, созданных разными брендами компиляторов . Вам, вероятно, нужно использовать тот же компилятор (или, по крайней мере, совместимый), с которым была создана библиотека, ИЛИ вам нужно получить версию библиотеки, созданную с помощью G CC (или собрать ее самостоятельно, если это возможно) , Существует бесплатная версия сообщества Visual Studio, если это поможет.

...