I just don't see where I went wrong.
The compiler complains about
Error 215 error LNK2001: Unresolved external symbol ""class std::vector<class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >,class std::allocator<class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > > > __cdecl splitW(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > &,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" (?splitW##YA?AV?$vector#V?$basic_string#_WU?$char_traits#_W#std##V?$allocator#_W#2##std##V?$allocator#V?$basic_string#_WU?$char_traits#_W#std##V?$allocator#_W#2##std###2##std##AAV?$basic_string#_WU?$char_traits#_W#std##V?$allocator#_W#2##2#ABV32##Z)". C:\voice\clsText.obj voice
But I don't see where I went wrong. Can somebody tell me how to analyze this error message? I get it quite often, but then again I never remember how I solved it.
Thank you very much!
This is my code in strhelper.cpp:
vector<wstring> splitW(const wstring& uMain, const wstring &uSplitBy)
{
vector<wstring>s;
int iStart=0;
for (;;)
{
int iPos=uMain.find(uSplitBy,iStart);
if (iPos==-1)
{
wstring s1;
s1 = uMain.substr(iStart,uMain.size() - iStart);
if (s1.size()>0)
{
s.push_back(s1);
}
break;
}
else
{
wstring s2;
s2 = uMain.substr(iStart,iPos-iStart);
s.push_back(s2);
iStart = iPos + 1;
}
}
return s;
}
And this is the part of the header that contains the declaration:
void replaceOnce(wstring& uText,const wstring& uSearchFor,const wstring& uReplaceWith,bool uTextCompare);
vector<wstring> splitW(wstring &str, const wstring &uSep);
vector<wstring> splitAToWVec(const string& uMain, const string& uSplitBy);
vector<string> splitAToAVec(const string& uMain, const string& uSplitBy);
The type of the 1st parameter of splitW() is declared as wstring& in header file but defined as const wstring& in source code. Please make them consistent.
Declaration:
vector<wstring> splitW( wstring& str, const wstring &uSep);
Definition:
vector<wstring> splitW(const wstring& uMain, const wstring &uSplitBy)
Related
I am trying to reuse a parser (named parser1_rule) that I have isolated in a translation unit (unit1.h/unit1.cpp), into another parser (name trace_parser). However I get a warning and an error message (reproduced and reformated below for easier reading) stating more or less (this is my interpretation) that parser1_rule have not been defined (or instantiated) for the new context trace_context_t.
Indeed, in X3, rules have two template parameters: iterators and context. I thought when mixing two rules, one had to make sure they both use the same context and iterator's types. So I paid attention to use the same context for parser1_rule and trace_parser : context_type. The same goes for the iterator, as recalled in X3: Linker Error (unresolved external symbol “parse_rule”) on nonterminal parser
But it seams this is not the way to go ? Shall I move the rule's definitions into an hpp file (which I wish I can avoid).
I created a minimal reproducible example to help understanding the issue:
EDIT: boost 1.71.0 and Visual Studio 16.8.2
unit1.h
#ifndef UNIT1_H
#define UNIT1_H
#include <cstdint>
#include "boost/spirit/home/x3.hpp"
#include "boost/spirit/include/support_istream_iterator.hpp"
namespace x3 = boost::spirit::x3;
using iter_t = boost::spirit::istream_iterator;
using context_t = x3::phrase_parse_context<x3::ascii::space_type>::type;
using parser1_t = x3::rule<class p1, std::uint64_t>;
BOOST_SPIRIT_DECLARE(parser1_t);
parser1_t const & ATparser();
#endif /* UNIT1_H */
unit1.cpp
#include "unit1.h"
parser1_t const parser1 = "parser1_rule";
auto const parser1_def = x3::lexeme[x3::lit("AT") >> x3::uint_];
BOOST_SPIRIT_DEFINE(parser1);
BOOST_SPIRIT_INSTANTIATE(parser1_t, iter_t, context_t);
parser1_t const& ATparser() { return parser1; }
Source.h
#ifndef SOURCE_H
#define SOURCE_H
#include <cstdint>
#include "boost/spirit/home/x3.hpp"
#include "boost/spirit/include/support_istream_iterator.hpp"
namespace x3 = boost::spirit::x3;
namespace trace {
using trace_parser_tag = struct trace_parser;
using rule_type = x3::rule<trace_parser_tag>;
BOOST_SPIRIT_DECLARE(rule_type);
}
trace::rule_type const& trace_parser();
#endif
Source.cpp
#include <iostream>
#include <fstream>
#include "unit1.h"
#include "Source.h"
namespace x3 = boost::spirit::x3;
/** reading:
Trace address: AT123434 */
namespace trace {
rule_type const tr = "trace_parser";
auto fill = [](auto& ctx) {}; /* semantic action to break automatic attribute propagation (first step) */
auto const tr_def = ("Trace address: " >> ATparser())[fill];
BOOST_SPIRIT_DEFINE(tr);
BOOST_SPIRIT_INSTANTIATE(rule_type,iter_t,context_t)
}
trace::rule_type const& trace_parser() {
return trace::tr;
}
int main(int argc, char* argv[])
{
std::string input("Trace address: AT123434");
std::ifstream i(input);
std::cout << "parsing: " << input << "\n";
boost::spirit::istream_iterator b(i >> std::noskipws);
boost::spirit::istream_iterator e = {};
bool v = x3::phrase_parse(b, e, trace_parser(), x3::ascii::space);
std::cout << "result: " << (v ? "OK" : "Failed") << "\n";
return v;
}
compilation output
1>Source.cpp
1>H:\X\XXXXX\unit1.h(26,1): warning C5046: 'parse_rule': Symbol involving type with internal linkage not defined
1>Source.obj : error LNK2019: unresolved external symbol "bool __cdecl parse_rule<class boost::spirit::basic_istream_iterator<char,struct std::char_traits<char> >,struct boost::spirit::x3::context<struct trace::trace_parser,struct boost::spirit::x3::action<struct boost::spirit::x3::sequence<struct boost::spirit::x3::literal_string<char const *,struct boost::spirit::char_encoding::standard,struct boost::spirit::x3::unused_type>,struct boost::spirit::x3::rule<class p1,unsigned __int64,0> >,class <lambda_bca3e58e86871d1e58f1a6062ad05fd2> > const ,struct boost::spirit::x3::context<struct boost::spirit::x3::skipper_tag,struct boost::spirit::x3::char_class<struct boost::spirit::char_encoding::ascii,struct boost::spirit::x3::space_tag> const ,struct boost::spirit::x3::unused_type> > >(struct boost::spirit::x3::rule<class p1,unsigned __int64,0>,class boost::spirit::basic_istream_iterator<char,struct std::char_traits<char> > &,class boost::spirit::basic_istream_iterator<char,struct std::char_traits<char> > const &,struct boost::spirit::x3::context<struct trace::trace_parser,struct boost::spirit::x3::action<struct boost::spirit::x3::sequence<struct boost::spirit::x3::literal_string<char const *,struct boost::spirit::char_encoding::standard,struct boost::spirit::x3::unused_type>,struct boost::spirit::x3::rule<class p1,unsigned __int64,0> >,class <lambda_bca3e58e86871d1e58f1a6062ad05fd2> > const ,struct boost::spirit::x3::context<struct boost::spirit::x3::skipper_tag,struct boost::spirit::x3::char_class<struct boost::spirit::char_encoding::ascii,struct boost::spirit::x3::space_tag> const ,struct boost::spirit::x3::unused_type> > const &,unsigned __int64 &)" [...cut...] referenced in function "public: bool __cdecl boost::spirit::x3::rule<class p1,unsigned __int64,0>::parse<class boost::spirit::basic_istream_iterator<char,struct std::char_traits<char> >,struct boost::spirit::x3::context<struct trace::trace_parser,struct boost::spirit::x3::action<struct boost::spirit::x3::sequence<struct boost::spirit::x3::literal_string<char const *,struct boost::spirit::char_encoding::standard,struct boost::spirit::x3::unused_type>,struct boost::spirit::x3::rule<class p1,unsigned __int64,0> >,class <lambda_bca3e58e86871d1e58f1a6062ad05fd2> > const ,struct boost::spirit::x3::context<struct boost::spirit::x3::skipper_tag,struct boost::spirit::x3::char_class<struct boost::spirit::char_encoding::ascii,struct boost::spirit::x3::space_tag> const ,struct boost::spirit::x3::unused_type> >,unsigned __int64>(class boost::spirit::basic_istream_iterator<char,struct std::char_traits<char> > &,class boost::spirit::basic_istream_iterator<char,struct std::char_traits<char> > const &,struct boost::spirit::x3::context<struct trace::trace_parser,struct boost::spirit::x3::action<struct boost::spirit::x3::sequence<struct boost::spirit::x3::literal_string<char const *,struct boost::spirit::char_encoding::standard,struct boost::spirit::x3::unused_type>,struct boost::spirit::x3::rule<class p1,unsigned __int64,0> >,class <lambda_bca3e58e86871d1e58f1a6062ad05fd2> > const ,struct boost::spirit::x3::context<struct boost::spirit::x3::skipper_tag,struct boost::spirit::x3::char_class<struct boost::spirit::char_encoding::ascii,struct boost::spirit::x3::space_tag> const ,struct boost::spirit::x3::unused_type> > const &,struct boost::spirit::x3::unused_type,unsigned __int64 &)const "
Warning:
1>H:\X\XXXXX\unit1.h(26,1): warning C5046: 'parse_rule': Symbol involving type with internal linkage not defined
Error message:
unresolved external symbol:
bool __cdecl parse_rule<iterator_t,trace_context_t>(
parser1_t,
iterator_t &,
iterator_t const &,
trace_context_t const &,
unsigned __int64 &
)
referenced in function
public:
bool __cdecl boost::spirit::x3::rule<class p1,unsigned __int64,0>::parse<
iterator_t, trace_context_t, unsigned __int64>
(
iterator_t &,
iterator_t const &,
trace_context_t const &,
struct boost::spirit::x3::unused_type,
unsigned __int64 &
)const
Assuming the following shorcuts:
using action_t = struct boost::spirit::x3::action<
struct boost::spirit::x3::sequence<
struct boost::spirit::x3::literal_string<
char const *,
struct boost::spirit::char_encoding::standard,
struct boost::spirit::x3::unused_type>,
struct boost::spirit::x3::rule<class p1,unsigned __int64,0>>,
class <lambda_bca3e58e86871d1e58f1a6062ad05fd2>>
using ctxt_t = struct boost::spirit::x3::context<
struct boost::spirit::x3::skipper_tag,
struct boost::spirit::x3::char_class<
struct boost::spirit::char_encoding::ascii,
struct boost::spirit::x3::space_tag> const ,
struct boost::spirit::x3::unused_type>>
using iterator_t = class boost::spirit::basic_istream_iterator<char,struct std::char_traits<char> >
using trace_context_t = struct boost::spirit::x3::context<
struct trace::trace_parser,
action_t const ,
ctxt_t>
Move to Boost 1.74.0 solved the issue.
This is driving me nuts, using MSVC14.1 I am making a library A to be used in another shared library B. It does not matter if the library A is static or shared, I always end up with 3 unresolved external symbols as such :
[build] GroomDeformer.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class avPoly::PolyMesh __cdecl avPoly::PolyMesh::create(class std::vector<struct glm::vec<3,float,0>,class std::allocator<struct glm::vec<3,float,0> > > const &,class std::vector<unsigned int,class std::allocator<unsigned int> > const &,class std::vector<unsigned __int64,class std::allocator<unsigned __int64> > const &)" (__imp_?create#PolyMesh#avPoly##SA?AV12#AEBV?$vector#U?$vec#$02M$0A##glm##V?$allocator#U?$vec#$02M$0A##glm###std###std##AEBV?$vector#IV?$allocator#I#std###4#AEBV?$vector#_KV?$allocator#_K#std###4##Z) referenced in function "public: void __cdecl avGroomCore::GroomDeformer::ConstructMesh(class std::vector<struct glm::vec<3,float,0>,class std::allocator<struct glm::vec<3,float,0> > > const &,class std::vector<unsigned __int64,class std::allocator<unsigned __int64> > const &,class std::vector<unsigned int,class std::allocator<unsigned int> > const &)" (?ConstructMesh#GroomDeformer#avGroomCore##QEAAXAEBV?$vector#U?$vec#$02M$0A##glm##V?$allocator#U?$vec#$02M$0A##glm###std###std##AEBV?$vector#_KV?$allocator#_K#std###4#AEBV?$vector#IV?$allocator#I#std###4##Z) [C:\Users\tufto\PycharmProjects\avgroom\build\src\core\Core.vcxproj]
[build] GroomDeformer.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class avPoly::FaceLocation __cdecl avPoly::PolyMesh::getClosestLocation(struct glm::vec<3,float,0> const &)" (__imp_?getClosestLocation#PolyMesh#avPoly##QEAA?AVFaceLocation#2#AEBU?$vec#$02M$0A##glm###Z) referenced in function "public: void __cdecl avGroomCore::GroomDeformer::DeformGroom(void)" (?DeformGroom#GroomDeformer#avGroomCore##QEAAXXZ) [C:\Users\tufto\PycharmProjects\avgroom\build\src\core\Core.vcxproj]
[build] GroomDeformer.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: struct glm::vec<3,float,0> __cdecl avPoly::PolyMesh::getAttributeValueFromLocation(class avPoly::FaceLocation const &,class avPoly::Attribute<struct glm::vec<3,float,0> > &)" (__imp_?getAttributeValueFromLocation#PolyMesh#avPoly##QEAA?AU?$vec#$02M$0A##glm##AEBVFaceLocation#2#AEAV?$Attribute#U?$vec#$02M$0A##glm###2##Z) referenced in function "public: void __cdecl avGroomCore::GroomDeformer::DeformGroom(void)" (?DeformGroom#GroomDeformer#avGroomCore##QEAAXXZ) [C:\Users\tufto\PycharmProjects\avgroom\build\src\core\Core.vcxproj]
I do not know what to do at this stage. I looked into the symbols from dumpbin and i do get the signatures, for example :
__imp_?create#PolyMesh#avPoly##SA?AV12#AEBV?$vector#U?$tvec3#M$0A##glm##V?$allocator#U?$tvec3#M$0A##glm###std###std##AEBV?$vector#IV?$allocator#I#std###4#AEBV?$vector#_KV?$allocator#_K#std###4##Z
The only thing i can notice is this has "tvec3" instead of just "vec" in the error signature. I think this refers to a typedef i have to GLM for library A such as :
typedef glm::vec3 Vector3;
typedef std::vector<Vector3> Vector3Array;
Any ideas or guidelines on how i could debug this ? I've tried all I can think off and can't put my finger on it. The worst part is that in the library A project i have another mini executable to test it that links just fine... (all using CMake). Both CMake configs are the same.
Here are the method signatures in the header file for these :
AVPOLYLIB_API
static PolyMesh create(Vector3Array const &positions, UIntArray const &faceVertexCounts, IndexArray const &faceVertexIndices);
AVPOLYLIB_API
FaceLocation getClosestLocation(Vector3 const &point);
AVPOLYLIB_API
Vector3 getAttributeValueFromLocation(FaceLocation const & location, Attribute<Vector3> &attribute);
DLL Export is done as follows :
#ifdef AVPOLYLIB_STATIC
#define AVPOLYLIB_API
#else
#ifdef AVPOLYLIB_EXPORTS
#define AVPOLYLIB_API __declspec(dllexport)
#else
#define AVPOLYLIB_API __declspec(dllimport)
#endif
#endif
The types used in these methods are declared like this (inside the library namespace):
class FaceLocation {
public:
Index triangleId;
Vector3 barycentricCoordinates;
};
typedef std::vector<Vector3> Vector3Array;
typedef std::vector<Index> IndexArray;
typedef std::vector<unsigned int> UIntArray;
Solved it ! It was silly : there was a problem with the glm headers as they where submodules in both libraries but for some reason where not version matching. So i did have a wrong signature in the exported symbols. Using the headers in the same folder solved the issue.
I know this question has been asked a lot of times here. But after trying all the mentioned solutions I am still not able to Compile the Test Boost code.
I have followed the following Steps for installation :-
Unzip Boost into a new directory.
Start a 64-bit MSVC command prompt and change to the directory where Boost was unzipped.
Run: bootstrap
Run: b2 toolset=msvc-10.0 --build-type=complete --libdir=C:\Boost\lib\x64 architecture=x86 address-model=64 install
Add C:\Boost\include\boost-(version) to your include path in Microsoft.Cpp.Win32.user property sheets.
Add C:\Boost\lib\x64 to your libs path in Microsoft.Cpp.Win32.user property sheets.
Additionally, I have added the lib path in additional library directory.
I am trying to compile a standard code to test whether boost is working properly or not.
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/regex.hpp>
using namespace std;
struct Hello
{
Hello(){
cout << "Hello constructor" << endl;
}
~Hello(){
cout << "Hello destructor" << endl;
cin.get();
}
};
int main(int argc, char**argv)
{
//Boost regex, compiled library
boost::regex regex("^(Hello|Bye) Boost$");
boost::cmatch helloMatches;
boost::regex_search("Hello Boost", helloMatches, regex);
cout << "The word between () is: " << helloMatches[1] << endl;
//Boost shared pointer, header only library
boost::shared_ptr<Hello> sharedHello(new Hello);
return 0;
}
The linker error I am getting is:-
1>Sample.obj : error LNK2019: unresolved external symbol "private: class boost::basic_regex<char,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > > & __thiscall boost::basic_regex<char,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > >::do_assign(char const *,char const *,unsigned int)" (?do_assign#?$basic_regex#DU?$regex_traits#DV?$w32_regex_traits#D#boost###boost###boost##AAEAAV12#PBD0I#Z) referenced in function "public: class boost::basic_regex<char,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > > & __thiscall boost::basic_regex<char,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > >::assign(char const *,char const *,unsigned int)" (?assign#?$basic_regex#DU?$regex_traits#DV?$w32_regex_traits#D#boost###boost###boost##QAEAAV12#PBD0I#Z)
1>Sample.obj : error LNK2019: unresolved external symbol "public: bool __thiscall boost::re_detail::perl_matcher<char const *,class std::allocator<struct boost::sub_match<char const *> >,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > >::find(void)" (?find#?$perl_matcher#PBDV?$allocator#U?$sub_match#PBD#boost###std##U?$regex_traits#DV?$w32_regex_traits#D#boost###boost###re_detail#boost##QAE_NXZ) referenced in function "bool __cdecl boost::regex_search<char const *,class std::allocator<struct boost::sub_match<char const *> >,char,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > >(char const *,char const *,class boost::match_results<char const *,class std::allocator<struct boost::sub_match<char const *> > > &,class boost::basic_regex<char,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > > const &,enum boost::regex_constants::_match_flags,char const *)" (??$regex_search#PBDV?$allocator#U?$sub_match#PBD#boost###std##DU?$regex_traits#DV?$w32_regex_traits#D#boost###boost###boost##YA_NPBD0AAV?$match_results#PBDV?$allocator#U?$sub_match#PBD#boost###std###0#ABV?$basic_regex#DU?$regex_traits#DV?$w32_regex_traits#D#boost###boost###0#W4_match_flags#regex_constants#0#0#Z)
1>Sample.obj : error LNK2019: unresolved external symbol "private: void __thiscall boost::re_detail::perl_matcher<char const *,class std::allocator<struct boost::sub_match<char const *> >,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > >::construct_init(class boost::basic_regex<char,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > > const &,enum boost::regex_constants::_match_flags)" (?construct_init#?$perl_matcher#PBDV?$allocator#U?$sub_match#PBD#boost###std##U?$regex_traits#DV?$w32_regex_traits#D#boost###boost###re_detail#boost##AAEXABV?$basic_regex#DU?$regex_traits#DV?$w32_regex_traits#D#boost###boost###3#W4_match_flags#regex_constants#3##Z) referenced in function "public: __thiscall boost::re_detail::perl_matcher<char const *,class std::allocator<struct boost::sub_match<char const *> >,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > >::perl_matcher<char const *,class std::allocator<struct boost::sub_match<char const *> >,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > >(char const *,char const *,class boost::match_results<char const *,class std::allocator<struct boost::sub_match<char const *> > > &,class boost::basic_regex<char,struct boost::regex_traits<char,class boost::w32_regex_traits<char> > > const &,enum boost::regex_constants::_match_flags,char const *)" (??0?$perl_matcher#PBDV?$allocator#U?$sub_match#PBD#boost###std##U?$regex_traits#DV?$w32_regex_traits#D#boost###boost###re_detail#boost##QAE#PBD0AAV?$match_results#PBDV?$allocator#U?$sub_match#PBD#boost###std###2#ABV?$basic_regex#DU?$regex_traits#DV?$w32_regex_traits#D#boost###boost###2#W4_match_flags#regex_constants#2#0#Z)
1>C:\Users\J.A.R.V.I.S\documents\visual studio 2010\Projects\Boost Sample\Debug\Boost Sample.exe : fatal error LNK1120: 3 unresolved externals
1>
What am I missing here?
I am using VS2010 and windows 64bit.
Thanks
There were 2 issues which were giving the linker error:-
Additional linker dependencies absent at Properties->Linker->Input->AdditionalDependencies
Project was win32. Needed to convert it to x64 using configuration manager.
When I'm trying to read a file with a function
void readFile(string fileName, string* anArray) {
unsigned int lineCounter = 0;
ifstream inFile = ifstream(fileName);
while (!inFile.eof()) {
string fileLine;
inFile >> fileLine;
if (!fileLine.empty()) {
anArray[lineCounter] = fileLine;
++lineCounter;
}
}
inFile.close();
}
I get the error below, which I assume is because of the pointer on the string array ?
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl
resource::readFile(class std::basic_string,class std::allocator >,class
std::basic_string,class
std::allocator > *)"
(?readFile#resource##YAXV?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##PAV23##Z)
referenced in function _main
void readFile(string fileName, string* anArray) {
This is the definition of a member function, but you forgot to write the class name.
void resource::readFile(string fileName, string* anArray) {
As you have it now, you've defined a new function in the global namespace that has nothing to do with resource, so when main tries to use resource::readFile, the definition cannot be found.
So here's my problem. I'm writing web browser plugin in Firebreath. Plugin has to connect to different databases (Firebird, MS SQL, My SQL etc.) depending on client request. So I'm creating class to manage connection to right DB. To connect to Firebird I'm trying to use IBPP. I managed to connect to FB using IBPP in simple test project. But now when I'm doing something much more complex I've got this strange linker error LNK2019.
Exact error message is:
Error 2 error LNK2019: unresolved external symbol "class IBPP::Ptr<class IBPP::IDatabase>
__cdecl IBPP::DatabaseFactory(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)
" (?DatabaseFactory#IBPP##YA?AV?$Ptr#VIDatabase#IBPP###1#ABV?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##000000#Z)
referenced in function "class IBPP::Ptr<class IBPP::IDatabase>
__cdecl IBPP::DatabaseFactory(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"
(?DatabaseFactory#IBPP##YA?AV?$Ptr#VIDatabase#IBPP###1#ABV?$basic_string#DU?$char_traits#D#std##V?$allocator#D#2##std##000#Z)
C:\ff-extensions\F4U\build\projects\F4UConv\Connections.obj F4UConv
Code for my connections looks like this:
Header
#ifndef Connections_h
#define Connections_h
#include <cstdarg>
#include <string>
#include "ibpp\ibpp.h"
#include "..\Logger\Logger.h"
using namespace std;
namespace Connections{
class Connection {
public:
void set_logger(Logger::Logger *logger);
virtual bool setup_connection(string machine, string db_path, string login, string passwd)=0;
virtual bool connect()=0;
virtual bool disconnect()=0;
virtual bool setup_statement(string sql_statement, const char *fmt, ...)=0;
template <class Statement>
Statement execute_statement();
protected:
string machine;
string db_path;
string login;
string passwd;
Logger::Logger *logger;
};
class FB_Connection : public Connection {
public:
~FB_Connection();
bool setup_connection(string machine, string db_path, string login, string passwd);
bool connect();
bool disconnect();
bool setup_statement(string sql_statement, const char *fmt, ...);
template <class Statement>
Statement execute_statement();
private:
IBPP::Database db;
};
};
#endif Connections_h
Source
#include "Connections.h"
namespace Connections{
void Connection::set_logger(Logger::Logger *logger){
this->logger = logger;
}
FB_Connection::~FB_Connection(){
if(this->db->Connected()){
this->disconnect();
}
db->Drop();
}
bool FB_Connection::setup_connection(string machine, string db_path, string login, string passwd){
this->machine = machine;
this->db_path = db_path;
this->login = login;
this->passwd = passwd;
try{
this->db = IBPP::DatabaseFactory(this->machine, this->db_path, this->login, this->passwd);
this->db->Create(3);
}catch(IBPP::Exception& e){
if(logger != nullptr){
this->logger->log(Logger::LogMsgValue[Logger::E_LOGMSG_000002]);
this->logger->log(Logger::LEVEL_ERROR, e.ErrorMessage());
}
return false;
}
return true;
}
bool FB_Connection::connect(){
return true;
}
bool FB_Connection::disconnect(){
return true;
}
bool FB_Connection::setup_statement(string sql_statement, const char *fmt, ...){
return true;
}
template <class Statement>
Statement FB_Connection::execute_statement(){
return this;
}
}
I'm googling for two days and still don't know what's the problem. I understand what LNK2019 error means but don't know why it occurs in this case.
The line that generate this error is:
this->db = IBPP::DatabaseFactory(this->machine, this->db_path, this->login, this->passwd);
Can anyone show me what's wrong?
Oh, and I'm using Visual Studio 2012 Express.
You are trying to access the method in the source for which you haven't provided the definition in the connection namespace , i.e
This method :
DatabaseFactory(this->machine, this->db_path, this->login, this->passwd);
Provide a definition for it in the connection namespace.
Write using namespace connections; in the source file.