在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设置中做错了什么?
答案 0 :(得分:1)
我的猜测。使用add_definitions
是错误的。它适用于预处理器宏而非编译器选项。我不确定这会如何干扰最终输出,但这是一个起点。
使用here重写您的cmakelists.txt文件以获取编译器选项。
答案 1 :(得分:1)
这是由使用-freg-struct-return
编译器标志引起的。所以最后与CMake无关,只是粗心的代码重用。感谢Bort指出我的编译器标志!