CMake Noob分段故障问题

时间:2013-10-13 03:47:07

标签: c cmake

我正在尝试使用计算给定数字的斐波纳契的示例项目来学习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

我哪里错了?

1 个答案:

答案 0 :(得分:3)

你是否确实你因为你的构建系统而遇到了段错误?

您的代码需要输入,并且不检查输入是否为。来自fib.c:26

myfib(atof( argv[1] ));

如果没有给出参数,您的代码将尝试读取您未提供的数据(和段错误)。如果您运行代码:./fibonacci 3,则会打印myfib。我猜这就是你的问题所在。


需要考虑的其他事项:

  • 在提供部分代码时,请尽量确保其最小化和完整性,或准确描述您的问题。大块注释掉的代码与问题无关,而在这种情况下,不提供头文件和Config.h.in(这是获取编译示例所必需的)。
  • myfib.cmyfib.h位于不同的文件夹中。如果myfib.cMathFunctions库的一部分,我会将源代码放入该子目录中。我在您认为您正在关注的教程中对此进行了解释:this one,其中包含一行CMakeLists.txt文件:

      

    add_library(MathFunctions mysqrt.cxx)

    MathFunctions库中。

  • 正如@nm在评论中指出的那样,atof需要float作为输入 - 斐波那契序列是使用int生成的(所以atoi更合适)。

  • 对于您的示例,我不会使用add_definitions来设置编译器标志。更好的方法(项目范围)是使用set ( CMAKE_CXX_FLAGS "-O0 -g -Wall")。 (有很多useful CMake Variables)。虽然add_definitions有效,但它并不是您正在做的工作的最佳工具。 :)