Wpis z mikrobloga

#rdkit #c++
Biblioteka rdkit nie ma porządnej dokumentacji do C++ API. Kilka przykładów w źródłach i tyle. Korzystając z przykładu zrobiłem minimalny kod który tylko tworzy obiekt MOL.

#include
#include
#include
#include
//#include
//#include
//#include
#include
#include
#include

using namespace RDKit;
//namespace io=boost::iostreams;

void readsmiles() {
std::string smiles="C1CCCC1";
RWMol *m;
m = SmilesToMol(smiles);
std::cout << m;
}

int main(int argc,char *argv[]) {
readsmiles();
}

Includy mocno na pałe, zakomentowałem tylko to co wyglądało na zupełnie zbędne.

Standardowa kompilacja działa. Polecenie:

g++ -o sample.exe smiles.cpp -I/usr/include/rdkit/ -L/usr/lib -lChemReactions -lFileParsers -lSmilesParse -lDepictor -lSubstructMatch -lGraphMol -lDataStructs -lRDGeometryLib -lRDGeneral


Generuje działający kod. Wersje statyczne mają w nazwie sufix static. Jednak analogiczne polecenie

g++ -v -o sample.exe smiles.cpp -I/usr/include/rdkit/ -L/usr/lib -lChemReactions
static -lFileParsersstatic -lSmilesParsestatic -lDepictorstatic -lSubstructMatchstatic -lGraphMolstatic -lDataStructsstatic -lRDGeometryLibstatic -lRDGeneralstatic

Nie działa. Wywala się na linkowaniu - trzeba dodać -lboostsystem Dopiero wtedy mamy coś co jest statycznie skompilowane z rdkitem. Kompilacja z nowszą wersją RDKita (zainstalowaną gdzieś na boku) z powyższymi opcjami nie działa:

undefined reference to `boost::detail::set
tss_data(void const*, boost::shared_ptr, void*, bool)'

trzeba dodać jeszcze -lboostthread, dopiero taka komenda działa:

g++ -o sample.exe smiles.cpp -I/opt/rdkit/include/rdkit/ -L/opt/rdkit/lib -lboost
system -lChemReactionsstatic -lFileParsersstatic -lSmilesParsestatic -lDepictorstatic -lSubstructMatchstatic -lGraphMolstatic -lDataStructsstatic -lRDGeometryLibstatic -lRDGeneralstatic -lboostthread

czemu tak. Nie mam pojęcia. Ważne, że jest binarka ze statycznie zlinkowanym RDKitem.
W następnych odcinkach może będzie opis RDKit C++ API.