Closed mohamdev closed 4 years ago
Hello Adjel,
The function is returning a LinuxDynamicLib by value but this class has no copy or move constructor implemented. I can consider adding a move constructor to make it easier to return it from functions or move it as an argument to functions/methods.
You could return a smart pointer from your function instead:
std::unique_ptr<LinuxDynamicLib<Scalar>> loadLibrary(std::vector<std::unique_ptr<GenericModel<Scalar>>> & models){
std::unique_ptr<LinuxDynamicLib<Scalar>> myLib(new LinuxDynamicLib<Scalar>("./fkine_angular_IMU1.so")); //Instantiation of the dynamic library
std::unique_ptr<GenericModel<Scalar>> myModel = myLib->model("fkine_angular_IMU1"); //Instantiation of the model, from the dynamic library
models.push_back(std::move(myModel));
return myLib;
}
If you are using C++14 you may be insterested in using
auto myLib = std::make_unique<LinuxDynamicLib<Scalar>>("./fkine_angular_IMU1.so");
Thank you very much for your fast feedback, I will try this as soon as possible and tell you if it worked in my case
I just tried it and it worked wonderfully, thank you very much. By the way, when generating and compiling the DynamicLibrary, do you think that it's possible to add several models based on different ADfun
in a single library ? Allowing me then to instantiate all my models from a single library this way :
std::unique_ptr<LinuxDynamicLib<Scalar>> myLib(new LinuxDynamicLib<Scalar>("./nameMyLib.so")); //Instantiation of the dynamic library
std::unique_ptr<GenericModel<Scalar>> myModel1 = myLib->model("nameModel1"); //Instantiation model 1
std::unique_ptr<GenericModel<Scalar>> myModel2 = myLib->model("nameModel2"); //Instantiation model 2
std::unique_ptr<GenericModel<Scalar>> myModelN = myLib->model("nameModelN"); //Instantiation model N
This is already possible. You can add multiple models to a ModelLibraryCSourceGen by either adding them to the constructor:
ModelCSourceGen<double> model1(adFun1, "nameModel1");
ModelCSourceGen<double> model2(adFun2, "nameModel2");
ModelCSourceGen<double> model3(adFun3, "nameModel3");
ModelLibraryCSourceGen<double> modelLibGen(model1, model2, model3);
or afterwars:
ModelCSourceGen<double> model3(fun1, "nameModel3");
modelLibGen.addModel(model3);
It worked great ! Thank you very much for your fast feedback :) have a nice day
Hello,
First I want to thank you for code and your help. I actually have a problem. I would like to load a
LinuxDynamicLib
(lets call itmyLib
) and the corresponding model (lets call itmyModel
) at the beggining of mymain()
. And then, I want to send both as argument for different functions, to be able to usemyModel
inside those functions. In fact, for the moment, I have to loadmyLib
andmyModel
, inside those functions, which takes pretty much time asmyLib
andmyModel
are loaded at every call of those functions. The code would run much faster if I instantiate only oncemyModel
andmyLib
at the beggining ofmain(),
and then send them as argument for the functions that needmyModel
.To do so, I coded the following function to load
myModel
andmyLib
and save them:This function takes as input a
std::vector
ofGenericModel<double>
s, loadsmyLib
, loadsmyModel
, addsmyModel
to my vectormodels
(which can contain several models from different libs), then returnsmyLib
. Actually, I have to returnmyLib
, otherwisemyModel
will be deleted. But when I doreturn myLib
I get the following compilation error :error : use of deleted function 'cppAD::cg::LinuxDynamicLib<Base>::LinuxDynamicLib(const cppAD::cg::LinuxDynamicLib<Base>&) [with Base = double]'
This error is actually pointing on the linereturn myLib
.I also have a
note : declared here
, which is pointing onLinuxDynamicLib(const LinuxDynamicLib&) = delete;
code line, in linux_dynamiclib.hpp file.Thank you very much for your help, I don't know if i'm misunderstanding someting, as i'm a begginer on C++. I wish you a nice day