I am attempting to build sample code from Actian Btrieve (https://docs.actian.com/psql/btrieve2v13/html/btest_8cpp-example.html)
It wouldn't build so I've simplified the code down to the following, just to get it working.
#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;
}
That code builds and runs successfully. Libraries are statically linked and the compiler finds the btrieveCpp.h header file because I've included in the search path.
The build command looks like hte following (the breaks are just so you can read it more easily):
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
The program output looks like:
The Problem
However, if I uncomment the BtrieveFile line then I get errors when I build, which looks like the following:
Using Code::Blocks IDE
I'm using the Code::Blocks IDE and when I right-click the BtrieveFile item and choose Find Declaration then the IDE takes me to the .H file so it knows where the item is defined.
Also, keep in mind that the other item (Btrieve::MAXIMUM_RECORD_LENGTH
) is also defined there (btrieveCpp.h), but it builds with no errors.
Here's where it takes me in the .H file:
What I've Tried
I thought this was because it needed the defintions provided by the .lib file so I added the appropriate .lib so the linker would find it and statically link it in.
I added the lib file as a dependency:
After that I attempted to build again but it still fails.
The build log looks like the following: You can see that the .lib is being linked in now.
-------- Build: Debug in Btrieve1 (compiler: GNU GCC Compiler)---------------
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 C:\Dev\Actian\Zen-SDK-Btrieve2API-Windows-noarch-14.00.046.000\win32\x86\btrieveCpp.lib
c:/devtools/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe:
obj\Debug\btest.o: in function `main':
C:/Dev/C++/Btrieve1/btest.cpp:13: undefined reference to 'BtrieveFile::BtrieveFile()'
c:/devtools/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe:
C:/Dev/C++/Btrieve1/btest.cpp:13: undefined reference to 'BtrieveFile::~BtrieveFile()'
c:/devtools/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe:
C://Dev/C++/Btrieve1/btest.cpp:13: undefined reference to 'BtrieveFile::~BtrieveFile()'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 2 second(s)) 4 error(s), 0 warning(s) (0 minute(s), 2 second(s))
Would you happen to know what I'm missing? Or what I need to do to resolve this?
EDIT - Changing Linkage
In btrieveC.h (included by btrieveCpp.h) there is indeed a block like the following:
#ifndef LINKAGE
#ifdef __GNUC__
#define LINKAGE
#else
#define LINKAGE __declspec(dllimport)
#endif
#endif
However, if make the switch so that #define LINKAGE __declspec(dllimport)
is used and then build I see the following errors (below)
Notice that the names are mangled in output now?
Edit 2 - nm output of btrieveCpp.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