我正在测试Armadillo库,并编写了四个要构建的cpp文件。
我可以用一个命令来构建它们:
g++ chol.cpp conj_grad.cpp main.cpp special_mat.cpp -larmadillo -std=c++14 -o test
Run Code Online (Sandbox Code Playgroud)
但是,当我先编译单个文件并将它们链接时,我会遇到链接错误:
g++ -c -std=c++14 -g -O1 main.cpp -o main.o
g++ -c -std=c++14 -g -O1 chol.cpp -o chol.o
g++ -c -std=c++14 -g -O1 conj_grad.cpp -o conj_grad.o
g++ -c -std=c++14 -g -O1 special_mat.cpp -o special_mat.o
g++ -larmadillo main.o chol.o conj_grad.o special_mat.o -o test
Run Code Online (Sandbox Code Playgroud)
错误信息:
main.o: In function `main':
/home/me/doc/study/numerical_optimization/chap5/main.cpp:71: undefined reference to `TLS init function for arma::arma_rng_cxx11_instance'
main.o: In function `std::__detail::_Adaptor<std::mersenne_twister_engine<unsigned long, 64ul, 312ul, 156ul, 31ul, 13043109905998158313ul, 29ul, 6148914691236517205ul, 17ul, 8202884508482404352ul, …Run Code Online (Sandbox Code Playgroud) C++中是否有指向其他人管理的资源的智能指针?我使用 pybind11 来包装 C++ 代码,如下所示。
class B {};
class A {
public:
// original C++ class interface
A(std::shared_ptr<B> pb) : mb(pb){}
// have to add this for pybind11, since pybind11 doesn't take shared_ptr as argument.
A(B * pb):A(std::shared_ptr<B>(pb)){}
private:
std::shared_ptr<B> mb;
}
namespace py = pybind11;
PYBIND11_MODULE(test, m)
{
py::class_<B>(m, "B")
.def(py::init<>());
py::class_<A>(m, "A")
.def(py::init<B *>());
}
Run Code Online (Sandbox Code Playgroud)
然后在 python 中,我将按如下方式使用它们:
b = B()
a = A(b)
Run Code Online (Sandbox Code Playgroud)
只要我不删除就可以了。当我在Python中del a时,我在C++的“A”中创建的shared_ptr mb将尝试销毁由Python管理的B对象并崩溃。所以,我的问题是 C++ 中是否有一些智能指针不从原始指针获取所有权?weak_ptr 不起作用,因为我仍然需要创建一个shared_ptr。