小编hlu*_*u58的帖子

g ++使用Armadillo库立即进行编译和链接与构建的结果不同

我正在测试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++ armadillo

5
推荐指数
0
解决办法
453
查看次数

指向外部托管(例如:Python)资源的 C++ 智能指针?

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。

c++ python pybind11

3
推荐指数
1
解决办法
1657
查看次数

标签 统计

c++ ×2

armadillo ×1

pybind11 ×1

python ×1