【问题标题】:Compiling program with CMake and Boost - compiles and links, but bad output and segfaults when run使用 CMake 和 Boost 编译程序 - 编译和链接,但运行时输出错误和段错误
【发布时间】:2013-01-30 13:18:27
【问题描述】:

在 Ubuntu 12.10(通过 repos 安装 libboost)上使用 CMake 2.8.9 和 Boost 1.49 编译程序时遇到问题。目前,该程序只是一些共享库和一个可执行文件(尚未使用这些库)。可执行文件使用boost::program_options 解析输入。

它的布局是这样的(会有更多的目录,例如共享库和包含,但它们还没有在 CMake 中提供):

src
    |- tools
    |   |- CMakeLists.txt
    |   |- main.cpp   <-- main executable
    |- CMakeLists.txt

当我手动编译时,它可以工作,但是当我 CMake 时,它​​会破坏一些文本,然后在最后出现段错误。到目前为止的程序代码只是program_options 文档中的“第一个”程序(你可以看到它here)。


我使用的手动编译命令是:

g++ -Wall -o myapp src/tools/main.cpp -lboost_program_options

使用myapp --help 给出正确的输出:

Allowed options:
  --help                produce help message
  --compression arg     set compression level

CMake 文件如下所示:

# src/CmakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(testApp CXX)

FIND_PACKAGE( Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})

ADD_DEFINITIONS(-g -O2
    -fsigned-char -freg-struct-return
    -Wall -W -Wshadow -Wpointer-arith -Wcast-qual -Winline -Werror)

ADD_SUBDIRECTORY(tools)
# src/tools/CmakeLists.txt
ADD_EXECUTABLE(main main.cpp)

TARGET_LINK_LIBRARIES(main
    ${Boost_LIBRARIES})

#rename to the final outut name
SET_TARGET_PROPERTIES(main
    PROPERTIES OUTPUT_NAME myapp)

当我运行 myapp --help 时,我得到以下输出:

,@:
  --help                produce help message
  --compression arg     set compression level

Segmentation fault (core dumped)

“@”符号经常变为其他符号,例如“`”、“�”和 Unicode-codepoints-in-boxes,这意味着它正在向我打印垃圾内存。

我在这个 CMake 设置中做错了什么?

【问题讨论】:

    标签: boost cmake boost-program-options


    【解决方案1】:

    我的猜测。 add_definitions 的用法是错误的。它适用于预处理器宏而不是编译器选项。我不确定这将如何干扰最终输出,但这是一个起点。 为给定的here 重写编译器选项的 cmakelists.txt 文件。

    【讨论】:

    • 感谢您的信息,我已更改为SET(CMAKE_CXX_FLAGS "flags" CACHE_STRING "" FORCE),但仍然得到相同的结果。
    【解决方案2】:

    这是由使用-freg-struct-return 编译器标志引起的。所以最终与CMake无关,只是粗心的代码重用。感谢 Bort 将我指向编译器标志!

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 1970-01-01
      • 2017-06-06
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 2014-05-28
      相关资源
      最近更新 更多