小编ZOl*_*ier的帖子

如何防止 CMake 在构建时(而不是安装时)为共享库创建符号链接?

我正在使用 CMake 在 Linux 上使用 Bullet3 构建一个项目,在构建整个解决方案时,它会构建附加了 SOVERSION 的 Bullet 输出库,并创建一个不带版本的符号链接。

对于我的特定场景,我不喜欢这种行为,并且我不想编辑项目符号子模块的 CMakeLists 文件。

这是我的 CMake,其中包含项目符号库:

    set(USE_DOUBLE_PRECISION ON CACHE BOOL "" FORCE)
    set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
    
    set(BUILD_BULLET3 OFF CACHE BOOL "" FORCE)
    set(BUILD_EGL OFF CACHE BOOL "" FORCE)
    set(BUILD_ENET OFF CACHE BOOL "" FORCE)
    set(BUILD_PYBULLET OFF CACHE BOOL "" FORCE)
    set(BUILD_OPENGL3_DEMOS OFF CACHE BOOL "" FORCE)
    set(BUILD_BULLET2_DEMOS OFF CACHE BOOL "" FORCE)
    set(BUILD_EXTRAS OFF CACHE BOOL "" FORCE)
    set(BUILD_UNIT_TESTS OFF CACHE BOOL "" FORCE)
    
    set(INSTALL_LIBS OFF CACHE BOOL …
Run Code Online (Sandbox Code Playgroud)

c++ linux cmake bulletphysics

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

c++17 std::thread join() :没有这样的过程

抱歉,标题是一个点击诱饵...解决起来并不像您想象的那么容易...这是一个真正的挑战

我遇到一个非常奇怪的问题,即 joinable() 的线程无法 join()。

我得到的错误是No such process

这不是典型的初学者两次加入线程的错误...这是一个复杂的问题,甚至可能是由内存损坏引起的...但我希望我只是错过了一些东西,我需要一个新的外部视图...我已经研究这个问题两天了。

我正在为 Linux 和 Windows 进行编译。

在 Linux 上(使用 gcc 9.1.0),它每次都能完美运行。

在 Windows 上(在我的 Linux 机器上使用 x86_64-w64-mingw32-g++ 9.2.0 并在我的 Windows 机器上运行该程序)我总是收到错误。

以下是我可以 100% 确认的内容:

  • 线程尚未加入。该线程只调用一次 join(),就会崩溃。
  • 线程不是默认构造的(它是用 new 分配的原始指针)
  • 线程正在工作(其他线程 join() 工作正常)
  • 调用 detach() 而不是 join() 会导致相同的错误
  • 不调用 join() (而是休眠一秒钟)“修复”问题
  • 父线程(创建有问题的线程的线程)与调用 join() 的线程相同
  • 无论我们是在 Debug (-ggdb -g -O0) 还是 Release (-O3) 下编译都不会改变结果(Linux 总是有效,Windows 总是失败)
  • 错误的线程是通过 lambda 函数创建的,该函数是从另一个 lambda 函数完美转发的

最后一点很可能是问题的根源,尽管我真的不明白是怎么回事。

我还知道包含线程指针的对象在 join() 之前不会被销毁。如果成功的话,我删除该指针的唯一位置是在 join() 之后。父对象被包装在一个shared_ptr 中。

指向该线程的指针也从未在其他地方使用/共享。

该代码在这里很难简化和共享,因为它是完整网络系统的一部分,并且它的所有方面都可能是问题的根源。

哦,实际的线程已正确执行,并且所有生成的网络通信都按其应有的方式工作,即使该线程无法加入。

这是重要部分的非常简化的版本,并附有解释所发生情况的注释: …

c++ windows multithreading stdthread c++17

0
推荐指数
1
解决办法
1613
查看次数

标签 统计

c++ ×2

bulletphysics ×1

c++17 ×1

cmake ×1

linux ×1

multithreading ×1

stdthread ×1

windows ×1