Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake Noob分段故障问题_C_Cmake - Fatal编程技术网

CMake Noob分段故障问题

CMake Noob分段故障问题,c,cmake,C,Cmake,我试图通过一个计算给定数字斐波那契的示例项目来学习CMake。我的项目最初包含一个“.c”文件和标题。我能够用CMake构建并运行,没有问题。现在我正试图学习如何通过将fibnoacci函数移动到一个单独的“.c”文件中来链接库,我使用CMake将该文件编译成一个可链接库。它构建时没有问题,但在我运行它时抛出了一个分段错误。我的项目结构是: fib | *---MathFunctions | | | *----CMakeLists.txt | | | *----myfib.h |

我试图通过一个计算给定数字斐波那契的示例项目来学习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中

纤维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;
}
从我运行的生成文件夹中运行“.cmake”和“make”后:

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

我哪里出了问题?

你真的确定因为你的构建系统你会遇到错误吗

您的代码需要输入,并且您不检查输入是否已给出。从
纤维c:26

myfib(atof( argv[1] ));
如果没有给出任何参数,代码将尝试读取尚未提供的数据(和segfault)。如果运行代码:
/fibonacci 3
,将打印
myfib
。我猜这就是你的问题所在


其他需要考虑的事项:

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

    添加库(MathFunctions mysqrt.cxx)

    MathFunctions
    库中

  • 正如@n.m在评论中指出的,
    atof
    采用
    float
    作为输入-斐波那契序列是使用
    int
    生成的(因此
    atoi
    更合适)

  • 对于您的示例,我不会使用设置编译器标志。更好的方法(项目范围)是使用
    set(CMAKE\u CXX\u FLAGS“-O0-g-Wall”)
    。(有很多)。虽然
    add_definitions
    有效,但它并不是您所从事工作的最佳工具。:)


你真的确定你的构建系统会导致一个错误吗

您的代码需要输入,并且您不检查输入是否已给出。从
纤维c:26

myfib(atof( argv[1] ));
如果没有给出任何参数,代码将尝试读取尚未提供的数据(和segfault)。如果运行代码:
/fibonacci 3
,将打印
myfib
。我猜这就是你的问题所在


其他需要考虑的事项:

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

    添加库(MathFunctions mysqrt.cxx)

    MathFunctions
    库中

  • 正如@n.m在评论中指出的,
    atof
    采用
    float
    作为输入-斐波那契序列是使用
    int
    生成的(因此
    atoi
    更合适)

  • 对于您的示例,我不会使用设置编译器标志。更好的方法(项目范围)是使用
    set(CMAKE\u CXX\u FLAGS“-O0-g-Wall”)
    。(有很多)。虽然
    add_definitions
    有效,但它并不是您所从事工作的最佳工具。:)


你真的确定你的构建系统会导致一个错误吗

您的代码需要输入,并且您不检查输入是否已给出。从
纤维c:26

myfib(atof( argv[1] ));
如果没有给出任何参数,代码将尝试读取尚未提供的数据(和segfault)。如果运行代码:
/fibonacci 3
,将打印
myfib
。我猜这就是你的问题所在


其他需要考虑的事项:

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

    添加库(MathFunctions mysqrt.cxx)

    MathFunctions
    库中

  • 正如@n.m在评论中指出的,
    atof
    采用
    float
    作为输入-斐波那契序列是使用
    int
    生成的(因此
    atoi
    更合适)

  • 对于您的示例,我不会使用设置编译器标志。更好的方法(项目范围)是使用
    set(CMAKE\u CXX\u FLAGS“-O0-g-Wall”)
    。(有