1

Ubuntu 12.10(リポジトリ経由でインストールされたlibboost)でCMake2.8.9およびBoost1.49を使用してプログラムをコンパイルするときに問題が発生します。現在、プログラムはいくつかの共有ライブラリと実行可能ファイル(まだライブラリを使用していません)です。実行可能ファイルはboost::program_options、入力を解析するために使用します。

これは次のようにレイアウトされています(共有ライブラリやインクルードなど、より多くのディレクトリがありますが、CMakeにはまだ機能していません):

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

手動でコンパイルすると機能しますが、CMakeすると、一部のテキストが破損し、最後にsegfaultが発生します。これまでのプログラムコードは、ドキュメントの「最初の」プログラムです(ここで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 に答える