使用CMake和Boost编译程序 - 编译和链接,但运行时输出和段错误

时间:2013-01-30 13:18:28

标签: boost cmake boost-program-options

在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

当我手动编译时,它可以正常工作,但是当我使用它时,它会破坏一些文本,然后在最后破坏段错误。到目前为止,程序代码只是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设置中做错了什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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