小编Bog*_*tza的帖子

获取对 std::thread::_M_start_thread 的未定义引用

我正在构建一个应用程序,该应用程序使用我从源代码构建的 3rd 方库 (Box2D-MT)。链接时,我收到此未定义的参考错误:

b2Threading.cpp:(.text._ZNSt6threadC2IM12b2ThreadPoolFviEJPS1_iEEEOT_DpOT0_[_ZNSt6threadC5IM12b2ThreadPoolFviEJPS1_iEEEOT_DpOT0_]+0xa4): 
undefined reference to 'std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)())'
Run Code Online (Sandbox Code Playgroud)

我正在用 g++ 构建并链接

-lBox2D -lpthread -lrt -ldl -lstdc++
Run Code Online (Sandbox Code Playgroud)

另外,我正在编译

-std=c++11
Run Code Online (Sandbox Code Playgroud)

查看 libstdc++.a 我可以看到类似的这个符号存在(它是“T”):

nm -C /usr/lib/gcc/x86_64-linux-gnu/4.9.2/libstdc++.a | grep _M_start_thread
0000000000000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>)
Run Code Online (Sandbox Code Playgroud)

但是这个重载不需要第二个参数。

我已经在所有互联网上搜索过类似的东西,但之前似乎没有人遇到过这个问题(在任何情况下)。

关于我为什么会收到此错误以及如何解决它的任何提示?

c++ multithreading g++ ld undefined-reference

5
推荐指数
1
解决办法
8319
查看次数

move-construct object with placement new

是不是UB移动 - 通过放置新建一个对象?

假设我有这段代码:

class Foo {
public:
    Foo() { foo_ = new int; }
    ~Foo() { delete foo_; }
    Foo(Foo &&f) {
        foo_ = std::swap(f.foo_, foo_);
    }
private:
    int* foo_;
}

void bar() {
    void* pMem = malloc(sizeof(Foo));
    Foo f1;
    // move-construct with placement new:
    new((Foo*)pMem) Foo(std::move(f1)); // f2 in *pMem

    // now f1 will contain a pointer foo_ of undefined value
    // when exiting scope f1.~Foo(){} will exhibit UB trying to delete it
}
Run Code Online (Sandbox Code Playgroud)

如果不明显,f1的成员foo_将在构造第二个foo后通过放置new和move构造得到一个未定义的值(这个未定义的值来自未初始化的Foo f2在其move-constructor中的foo_,因为值是交换的) …

c++ placement-new move-constructor c++11

2
推荐指数
1
解决办法
1239
查看次数

std :: vector &lt;T&gt;上的模板专门化

我正在尝试编写一个模板函数来处理任何类型的参数,包括矢量,地图等,但是遇到了麻烦。

template<class C>
void foo(C c);

template<>
template<class V>
void foo<std::vector<V> >(std::vector<V> v);
Run Code Online (Sandbox Code Playgroud)

编译器(g ++ 4.9.2-10)会抱怨:

test.cpp:13:43: error: too many template parameter lists in declaration of ‘void foo(std::vector<V>)’
 void foo<std::vector<V> >(std::vector<V> v) {
                                           ^
test.cpp:13:6: error: template-id ‘foo<std::vector<V> >’ for ‘void foo(std::vector<V>)’ does not match any template declaration
 void foo<std::vector<V> >(std::vector<V> v) {
      ^
test.cpp:13:43: note: saw 2 ‘template<>’, need 1 for specializing a member function template
 void foo<std::vector<V> >(std::vector<V> v) {
                                           ^
Run Code Online (Sandbox Code Playgroud)

我该如何实现?我也想专门研究std :: map <std :: string,V>

从专业化中删除第一个template …

c++ templates template-specialization

2
推荐指数
1
解决办法
1499
查看次数