1

在 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文档中的“第一个”程序(您可以在此处查看)。


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

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 设置中做错了什么?

4

2 回答 2

1

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

于 2013-01-30T16:01:07.293 回答
1

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

于 2013-01-30T14:45:42.943 回答