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

编者按:

# 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] ));

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


其他需要考虑的事项:

  • 当给出一部分代码时,尽量确保它是最小的和完整的,或者准确地描述了你的问题。大块注释掉的代码与问题无关,而在这种情况下Config.h.in,没有提供头文件和(编译您的示例所必需的)。
  • myfib.c并且myfib.h在不同的文件夹中。如果myfib.cMathFunctions库的一部分,我会将源代码放入该子目录中。这在我认为您正在关注的教程中进行了解释:this one,它有一个CMakeLists.txt包含以下行的文件:

    add_library(MathFunctions mysqrt.cxx)

    MathFunctions图书馆。

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

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

于 2013-10-13T06:59:59.713 回答