Re: [Rdkit-discuss] strange linker error using VC++
Hi Jason, Correct. You'd probably better use std::unique_ptr unless you are planning to reference the original pointer from multiple std::shared_ptr's. Cheers, p. On 11/01/2018 14:42, Jason Biggs wrote: On Thu, Jan 11, 2018 at 8:03 AM, Paolo Tosco> wrote: Hi Jason, I believe the problem here is that if you are building outside CMake the WIN32 preprocessor macro is not defined (_WIN32 is). So, when ROMol.h is parsed, the ROMol class definition includes a "private" directive that should not be there, hence the error. To fix the issue, you need to add to your cl command line a /DWIN32. Thank you! This did the trick. I should learn to use CMake instead of compiling everything in Mathematica (when all you have is a hammer, everything looks like a nail) As a side note, I am not sure you really want to do: RDKit::ROMol mol = *(RDKit::SmilesToMol(smi)); std::string res = RDKit::MolToSmiles(mol); In fact, this makes a copy of the molecule that the pointer returned by SmilesToMol() points to, while leaking the memory pointed to. If you are not interested in making a copy of the returned molecule, you should probably rather do: RDKit::RWMol *mol = RDKit::SmilesToMol(smi); std::string res = RDKit::MolToSmiles(*mol); delete mol; You are definitely correct here, I was trying to make the simplest failing example and the example without the copy compiled fine - declaring a pointer to an ROMol is fine but declaring an actual object triggered the error. I'm very new to c++, will keep in mind to always delete my pointers. If I understand correctly, if I always wrap my ROMol objects in a std::shared_ptr (or the boost equivalent), then the memory will not be leaked. Is that right? Best, Jason If you actually meant to make a copy, you'd better do: RDKit::RWMol *mol = RDKit::SmilesToMol(smi); RDKit::ROMol molCopy(*mol); delete mol; std::string res = RDKit::MolToSmiles(molCopy); Cheers, p. On 11/01/2018 02:33, Jason Biggs wrote: I'm trying to use the rdkit as a library in another project, and am having trouble getting it to build on windows. I can get the code to compile on mac and linux, but it fails for windows, both 32-big and 64-bit varieties. I don't know how specific this is to the rdkit, but I have zero experience compiling with visual studio (and very little C++ coding background) and I am very confused here. The following is just a toy example showing the minimum necessary for me to get the error. I get the same error using the full code. If I create a test class using this code, I can compile it just fine in windows: #include #include #include classtestClass{ testClass(); ~testClass(); std::string testFunc() { std::string smi = "CCC"; RDKit::ROMol mol = *(RDKit::SmilesToMol(smi)); std::string res = RDKit::MolToSmiles(mol); returnres; }; }; testClass::testClass() { } testClass::~testClass() { } But if I move the definition of the testFunc() function outside of the class declaration (which is the normal case, where the definitions are in separate files), like this #include #include #include classtestClass{ testClass(); ~testClass(); std::string testFunc(); }; testClass::testClass() { } testClass::~testClass() { } std::string testClass::testFunc() { std::string smi = "CCC"; RDKit::ROMol mol = *(RDKit::SmilesToMol(smi)); std::string res = RDKit::MolToSmiles(mol); returnres; }; then I get the following linker errors: error LNK2019: unresolved external symbol "private: virtual void __thiscall RDKit::ROMol::destroy(void)" (?destroy@ROMol@RDKit@@EAEXXZ) referenced in function "public: virtual __thiscall RDKit::ROMol::~ROMol(void)" (??1ROMol@RDKit@@UAE@XZ) failing.obj : error LNK2019: unresolved external symbol "private: void __thiscall RDKit::ROMol::initFromOther(class RDKit::ROMol const &,bool,int)" (?initFromOther@ROMol@RDKit@@AAEXABV12@_NH@Z) referenced in function "public: __thiscall RDKit::ROMol::ROMol(class RDKit::ROMol const &,bool,int)" (??0ROMol@RDKit@@QAE@ABV01@_NH@Z) C:\Users\IEUser\Documents\rdkitlink_windows_compile_issue\Working-ie11win7-3268-3284-12\RDKitLink.dll : fatal error LNK1120: 2 unresolved externals I can't understand why moving the definition of testFunc() causes this error. Any help would be most appreciated. Clearly I can use the workaround of making all definitions for testClass in the header
Re: [Rdkit-discuss] strange linker error using VC++
On Thu, Jan 11, 2018 at 8:03 AM, Paolo Toscowrote: > Hi Jason, > > I believe the problem here is that if you are building outside CMake the > WIN32 preprocessor macro is not defined (_WIN32 is). So, when ROMol.h is > parsed, the ROMol class definition includes a "private" directive that > should not be there, hence the error. To fix the issue, you need to add to > your cl command line a /DWIN32. > Thank you! This did the trick. I should learn to use CMake instead of compiling everything in Mathematica (when all you have is a hammer, everything looks like a nail) > As a side note, I am not sure you really want to do: > > RDKit::ROMol mol = *(RDKit::SmilesToMol(smi)); > std::string res = RDKit::MolToSmiles(mol); > > In fact, this makes a copy of the molecule that the pointer returned by > SmilesToMol() points to, while leaking the memory pointed to. > If you are not interested in making a copy of the returned molecule, you > should probably rather do: > > RDKit::RWMol *mol = RDKit::SmilesToMol(smi); > std::string res = RDKit::MolToSmiles(*mol); > delete mol; > You are definitely correct here, I was trying to make the simplest failing example and the example without the copy compiled fine - declaring a pointer to an ROMol is fine but declaring an actual object triggered the error. I'm very new to c++, will keep in mind to always delete my pointers. If I understand correctly, if I always wrap my ROMol objects in a std::shared_ptr (or the boost equivalent), then the memory will not be leaked. Is that right? Best, Jason > > > If you actually meant to make a copy, you'd better do: > > RDKit::RWMol *mol = RDKit::SmilesToMol(smi); > RDKit::ROMol molCopy(*mol); > delete mol; > std::string res = RDKit::MolToSmiles(molCopy); > > Cheers, > p. > > > On 11/01/2018 02:33, Jason Biggs wrote: > > I'm trying to use the rdkit as a library in another project, and am having > trouble getting it to build on windows. I can get the code to compile on > mac and linux, but it fails for windows, both 32-big and 64-bit varieties. > I don't know how specific this is to the rdkit, but I have zero experience > compiling with visual studio (and very little C++ coding background) and I > am very confused here. The following is just a toy example showing the > minimum necessary for me to get the error. I get the same error using the > full code. > > > If I create a test class using this code, I can compile it just fine in > windows: > > > #include > > #include > > #include > > > class testClass{ > > > > testClass(); > > > > ~testClass(); > > > > > > std::string testFunc() { > > std::string smi = "CCC"; > > RDKit::ROMol mol = *(RDKit::SmilesToMol(smi)); > > std::string res = RDKit::MolToSmiles(mol); > > return res; > > }; > > > > }; > > > testClass::testClass() { > > } > > > testClass::~testClass() { > > } > > > > But if I move the definition of the testFunc() function outside of the > class declaration (which is the normal case, where the definitions are in > separate files), like this > > > #include > > #include > > #include > > > > class testClass{ > > > > testClass(); > > > > ~testClass(); > > > > std::string testFunc(); > > > > }; > > > testClass::testClass() { > > } > > > testClass::~testClass() { > > } > > > std::string testClass::testFunc() { > > std::string smi = "CCC"; > > RDKit::ROMol mol = *(RDKit::SmilesToMol(smi)); > > std::string res = RDKit::MolToSmiles(mol); > > return res; > > }; > > then I get the following linker errors: > > error LNK2019: unresolved external symbol "private: virtual void > __thiscall RDKit::ROMol::destroy(void)" (?destroy@ROMol@RDKit@@EAEXXZ) > referenced in function "public: virtual __thiscall > RDKit::ROMol::~ROMol(void)" (??1ROMol@RDKit@@UAE@XZ) > failing.obj : error LNK2019: unresolved external symbol "private: void > __thiscall RDKit::ROMol::initFromOther(class RDKit::ROMol const > &,bool,int)" (?initFromOther@ROMol@RDKit@@AAEXABV12@_NH@Z) referenced in > function "public: __thiscall RDKit::ROMol::ROMol(class RDKit::ROMol const > &,bool,int)" (??0ROMol@RDKit@@QAE@ABV01@_NH@Z) > C:\Users\IEUser\Documents\rdkitlink_windows_compile_ > issue\Working-ie11win7-3268-3284-12\RDKitLink.dll : fatal error LNK1120: > 2 unresolved externals > > > I can't understand why moving the definition of testFunc() causes this > error. > > Any help would be most appreciated. Clearly I can use the workaround of > making all definitions for testClass in the header file, but I would rather > not do that. > > Thank you, > Jason > > > > -- > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > > > > ___ > Rdkit-discuss mailing >
Re: [Rdkit-discuss] strange linker error using VC++
Hi Jason, I believe the problem here is that if you are building outside CMake the WIN32 preprocessor macro is not defined (_WIN32 is). So, when ROMol.h is parsed, the ROMol class definition includes a "private" directive that should not be there, hence the error. To fix the issue, you need to add to your cl command line a /DWIN32. As a side note, I am not sure you really want to do: RDKit::ROMol mol = *(RDKit::SmilesToMol(smi)); std::string res = RDKit::MolToSmiles(mol); In fact, this makes a copy of the molecule that the pointer returned by SmilesToMol() points to, while leaking the memory pointed to. If you are not interested in making a copy of the returned molecule, you should probably rather do: RDKit::RWMol *mol = RDKit::SmilesToMol(smi); std::string res = RDKit::MolToSmiles(*mol); delete mol; If you actually meant to make a copy, you'd better do: RDKit::RWMol *mol = RDKit::SmilesToMol(smi); RDKit::ROMol molCopy(*mol); delete mol; std::string res = RDKit::MolToSmiles(molCopy); Cheers, p. On 11/01/2018 02:33, Jason Biggs wrote: I'm trying to use the rdkit as a library in another project, and am having trouble getting it to build on windows. I can get the code to compile on mac and linux, but it fails for windows, both 32-big and 64-bit varieties. I don't know how specific this is to the rdkit, but I have zero experience compiling with visual studio (and very little C++ coding background) and I am very confused here. The following is just a toy example showing the minimum necessary for me to get the error. I get the same error using the full code. If I create a test class using this code, I can compile it just fine in windows: #include #include #include classtestClass{ testClass(); ~testClass(); std::string testFunc() { std::string smi = "CCC"; RDKit::ROMol mol = *(RDKit::SmilesToMol(smi)); std::string res = RDKit::MolToSmiles(mol); returnres; }; }; testClass::testClass() { } testClass::~testClass() { } But if I move the definition of the testFunc() function outside of the class declaration (which is the normal case, where the definitions are in separate files), like this #include #include #include classtestClass{ testClass(); ~testClass(); std::string testFunc(); }; testClass::testClass() { } testClass::~testClass() { } std::string testClass::testFunc() { std::string smi = "CCC"; RDKit::ROMol mol = *(RDKit::SmilesToMol(smi)); std::string res = RDKit::MolToSmiles(mol); returnres; }; then I get the following linker errors: error LNK2019: unresolved external symbol "private: virtual void __thiscall RDKit::ROMol::destroy(void)" (?destroy@ROMol@RDKit@@EAEXXZ) referenced in function "public: virtual __thiscall RDKit::ROMol::~ROMol(void)" (??1ROMol@RDKit@@UAE@XZ) failing.obj : error LNK2019: unresolved external symbol "private: void __thiscall RDKit::ROMol::initFromOther(class RDKit::ROMol const &,bool,int)" (?initFromOther@ROMol@RDKit@@AAEXABV12@_NH@Z) referenced in function "public: __thiscall RDKit::ROMol::ROMol(class RDKit::ROMol const &,bool,int)" (??0ROMol@RDKit@@QAE@ABV01@_NH@Z) C:\Users\IEUser\Documents\rdkitlink_windows_compile_issue\Working-ie11win7-3268-3284-12\RDKitLink.dll : fatal error LNK1120: 2 unresolved externals I can't understand why moving the definition of testFunc() causes this error. Any help would be most appreciated. Clearly I can use the workaround of making all definitions for testClass in the header file, but I would rather not do that. Thank you, Jason -- Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot ___ Rdkit-discuss mailing list Rdkit-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rdkit-discuss -- Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot___ Rdkit-discuss mailing list Rdkit-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rdkit-discuss