当前位置: 首页 > 知识库问答 >
问题:

为什么在运行没有cmake编译的示例程序时会出现分段错误?(MSYS2,Mingw-w64)

步骏
2023-03-14

cmake的makefile网络与简单的编译和链接在最终可执行文件中有什么不同?

我试图使用子弹物理库(Bullet3-2.83.7)https://github.com/bulletphysics/bullet3.
我在MSYS2中编译了这个库,并且用明w-w64发出了一些警告。
之后,我可以毫无问题地运行示例程序,特别是示例浏览器和HelloWorld。
我已经一直试图将HelloWorld源合并到一个测试项目中,只使用一个Makefile,但是每当在可执行文件中调用动态世界时,我都会得到SIGSEGV错误。SEGFAULT发生在行DynamicsWorld-

main (argc=1, argv=0x5f4eb0) at main.cpp:78
78                      dynamicsWorld->addRigidBody(body);
(gdb) step
0x0000000000002000 in ?? ()
(gdb) step
Cannot find bounds of current function
(gdb) bt full
#0  0x0000000000002000 in ?? ()
No symbol table info available.
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

我不知道如何处理这些信息。我假设/希望我只是缺少一个编译器或链接器标志
我原来的Makefile是一个基于http://make.mad-scientist.net/papers/advanced-auto-dependency-generation.我假设只要在示例代码中添加库并包含目录-lBulletDynamics\u Debug-lBulletCollision\u Debug-lLinearMath\u Debug就足够了

我还尝试了一个简化的Makefile,其中包含了我在bullet3/examples/HelloWorld中找到的命令和标志

我的路径环境变量是干净的,LD_LIBRARY_PATH中没有任何内容(在MSYS:echo$PATH中)

MSYS2 Mingw-w64
gcc 10.1.0
MSYS 20180531msys64 ? pacman updated a lot of things
CMake 3.17.3
GNU Make 4.3
CXX_DEFINES = -DUSE_GRAPHICAL_BENCHMARK -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS 

CXX_INCLUDES = -I"C:\lib64\include\bullet3"
CXX_FLAGS = -g -fpermissive -D_DEBUG 

.PHONY: all
all:
    g++.exe $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o main.obj -c main.cpp
    ar cr main.a main.obj
    g++.exe $(CXX_FLAGS) -Wl,--whole-archive main.a -Wl,--no-whole-archive -o bulletTest.exe -Wl,--major-image-version,0,--minor-image-version,0 libBulletDynamics_Debug.a libBulletCollision_Debug.a libLinearMath_Debug.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32

# -L"C:\lib64\lib" 

.PHONY: run
run:
    gdb -ex run bulletTest.exe -ex "bt full" -ex quit --batch

.PHONY: clean
clean:
    rm -f ./bulletTest.exe ./main.obj ./main.a

在公报3-2.83中。7目录(tar.gz自https://github.com/bulletphysics/bullet3/releases)

mkdir build-mingw64
cd build-mingw64
cmake -G "MSYS Makefiles" \
    -DBUILD_SHARED_LIBS=0 \
    -DBUILD_EXTRAS=1 \
    -DINSTALL_LIBS=0 \
    -DUSE_GLUT=1 \
    -DCMAKE_CXX_FLAGS_DEBUG="-fpermissive -g" \
    -DINSTALL_EXTRA_LIBS=0 \
    -DCMAKE_BUILD_TYPE=Debug ..
make -j

共有1个答案

许波涛
2023-03-14

我遇到了同样的问题。在我的例子中,这是因为Bullet是以USE_DOUBLE_精度编译的,所以将以下内容添加到我的可执行文件的CmakeList中为我解决了这个问题:

target_compile_options(<target_name> BEFORE PUBLIC -DBT_USE_DOUBLE_PRECISION)
 类似资料:
  • 我最终得到了一个500的错误,这取决于stacktrace,这可能是一个数据格式错误,但我所有的变量都是字符串,所以我根本看不到错误在哪里。此外,我的连接jdbc很好,因为在调试模式下,我可以看到数据库的值,但一旦它进入JSP中,它就不再工作了。你能帮帮我吗? servlet JSP 豆类 BDD连接 堆栈跟踪 我的servlet:

  • 问题内容: 在我的关于多态性的专业幻灯片中,我看到了这段代码,并带有一些注释: 如您所见,它在第一个强制转换语句中表示将产生 运行时 错误,而在另一个声明中将产生 编译器错误 。 是什么导致这些错误?以及它们之间有何不同? 问题答案: 仅在代码实际运行时才会发生运行时错误。这些是最困难的-导致程序崩溃和代码中的错误,难以跟踪。 一个示例可能正在尝试将字符串“ hello”转换为整数: 编译器可能不

  • 问题内容: 我正在尝试使用Ant脚本和Java编译JasperReports模板。我收到此错误: 模板中没有什么复杂的东西,但是我仍然无法编译。 问题答案: 您必须将模板中的值设置为Java。有两种方法可以执行此操作: 如果使用的是 iReport,请 在 “报告检查器”中 选择根对象(与报告名称相同的根对象)。然后在“ 属性” 窗口中,从“ 语言” 下拉列表中选择“ Java ” 。 __ 如果

  • 我使用IntelliJ进行java开发。我想在我只有shell访问权限的另一台主机上运行我的应用程序。 当我在本地运行应用程序时,一切都很好。当我尝试在远程主机上编译代码时,我得到: 文件位于同一目录中: 我也不能在本地编译,除非它来自IDE,所以我假设我只是没有做正确的事情。我错过了什么?我只想能够从shell运行我的应用程序,我真的不在乎如何运行。

  • 我正在尝试为协议缓冲区构建Java运行时库。我在Windows和OS X上都犯了错误,因为我遵循了Protocol Buffers项目(从中克隆而来)中Java目录下的自述指令https://github.com/google/protobuf). 当我在protobuf/java目录下运行