0

特定の数値のフィボナッチを計算するサンプル プロジェクトを使用して CMake を学習しようとしています。私のプロジェクトには、もともと単一の「.c」ファイルとヘッダーが含まれていました。CMake でビルドし、問題なく実行できました。現在、fibnoacci 関数を別の「.c」ファイルに移動し、CMake を使用してリンク可能なライブラリにコンパイルすることで、ライブラリをリンクする方法を学ぼうとしています。問題なくビルドされますが、実行するとセグメンテーション違反がスローされます。私のプロジェクト構造は次のとおりです。

fib
|
*---MathFunctions
|   |
|   *----CMakeLists.txt
|   |
|   *----myfib.h
|
*---CMakeLists.txt
|
*---fib.c
|
*---fib.h
|
*---myfib.c
|
*---Config.in.h

MathFunctions フォルダーの下の CMakeLists.txt は空です。すべてのプログラム ロジックは fib.c と myfib.c にあります。すべてのビルドは、一番上の CMakeLists.txt にあります。

fib.c:

# include "stdio.h"
# include "stdlib.h"
# include "Config.h"
#include "myfib.h"

void internalfib(int num)
{
    printf("Internally defined fib\n");
    int a, b;
    a = 0;
    b = 1;
    printf( "custom fib of %d", b );
    for( int i = 0; i + a <= num; b = i ) {
        i = a + b;
        a = b;
        printf( ", %d", i );
    }
}

int main( int argc, char** argv) {
    fprintf(stdout,"%s Version %d.%d\n",
                argv[0],
                VERSION_MAJOR,
                VERSION_MINOR);
#ifdef SHOW_OWNER
    fprintf(stdout, "Project Owner: %s\n", OWNER);
#endif
    myfib(atof( argv[1] ));
    printf("\n");
    return EXIT_SUCCESS;
}

myfib.c:

# include "stdio.h"
# include "stdlib.h"

void myfib(int num)
{
    printf("custom myfib");
    int a, b;
    a = 0;
    b = 1;
    printf( "custom fib of %d", b );
    for( int i = 0; i + a <= num; b = i ) {
        i = a + b;
        a = b;
        printf( ", %d", i );
    }
}

CMakeLists.txt:

#Specify the version being used aswell as the language
cmake_minimum_required(VERSION 2.6)
#Name your project here
project(fibonacci)
enable_testing()
set (VERSION_MAJOR 1)
set (VERSION_MINOR 0)

configure_file (
  "${PROJECT_SOURCE_DIR}/Config.h.in"
  "${PROJECT_BINARY_DIR}/Config.h"
  )

option (SHOW_OWNER "Show the name of the project owner" ON)

#Sends the -std=c99 flag to the gcc compiler
add_definitions(-std=c99)

include_directories("${PROJECT_BINARY_DIR}")
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
add_library(MathFunctions myfib.c)

#This tells CMake to fib.c and name it fibonacci
add_executable(fibonacci fib.c)
target_link_libraries (fibonacci MathFunctions)

#test that fibonacci runs
add_test (FibonacciRuns fibonacci 5)
#Test the fibonacci of 5
add_test (FibonacciCompare5 fibonacci 5)

set_tests_properties (FibonacciCompare5 PROPERTIES PASS_REGULAR_EXPRESSION "1, 1, 2, 3, 5")

install (TARGETS fibonacci DESTINATION ${PROJECT_BINARY_DIR}/bin)

ビルドフォルダーから「..cmake」と「make」を実行した後、次を実行します。

~/dev/cworkshop/fib/build$ ./fibonacci
./fibonacci Version 1.0
Project Owner: Clifton C. Craig
Segmentation fault: 11

どこが間違っていますか?

4

1 に答える 1

3

ビルドシステムが原因でセグメンテーション違反が発生していると確信していますか?

コードには入力が必要ですが、入力が与えられていることを確認していません。からfib.c:26:

myfib(atof( argv[1] ));

引数が指定されていない場合、コードは提供されていないデータを読み取ろうとします (および segfault)。コードを実行すると:が出力さ./fibonacci 3れますmyfib。これがあなたの問題だと思います。


その他の考慮事項:

  • コードの一部を提供するときは、それが最小限かつ完全であること、または問題を正確に説明していることを確認してください。コメントアウトされたコードの大きなブロックは質問とは関係ありませんが、この場合、ヘッダー ファイルとConfig.h.in(例をコンパイルするために必要です) は提供されません。
  • myfib.cmyfib.h別のフォルダにあります。myfib.cがライブラリの一部である場合MathFunctions、ソースをそのサブディレクトリに配置します。これは、次の行を含むファイルがあるチュートリアル I think you're following: this oneで説明されています。CMakeLists.txt

    add_library(MathFunctions mysqrt.cxx)

    MathFunctions図書館で。

  • コメントで @nm が指摘したように、入力としてatofafloatを受け取ります - フィボナッチ数列は an を使用して生成されますint(atoiより適切です)。

  • あなたの例ではadd_definitions、コンパイラフラグを設定するために使用しません。それを行うより良い方法 (プロジェクト全体) は、 を使用することset ( CMAKE_CXX_FLAGS "-O0 -g -Wall")です。(便利な CMake 変数がたくさんあります)。機能しadd_definitionsますが、あなたがしている仕事に最適なツールではありません. :)

于 2013-10-13T06:59:59.713 に答える