CMake Noob分段故障问题
我试图通过一个计算给定数字斐波那契的示例项目来学习CMake。我的项目最初包含一个“.c”文件和标题。我能够用CMake构建并运行,没有问题。现在我正试图学习如何通过将fibnoacci函数移动到一个单独的“.c”文件中来链接库,我使用CMake将该文件编译成一个可链接库。它构建时没有问题,但在我运行它时抛出了一个分段错误。我的项目结构是:CMake Noob分段故障问题,c,cmake,C,Cmake,我试图通过一个计算给定数字斐波那契的示例项目来学习CMake。我的项目最初包含一个“.c”文件和标题。我能够用CMake构建并运行,没有问题。现在我正试图学习如何通过将fibnoacci函数移动到一个单独的“.c”文件中来链接库,我使用CMake将该文件编译成一个可链接库。它构建时没有问题,但在我运行它时抛出了一个分段错误。我的项目结构是: fib | *---MathFunctions | | | *----CMakeLists.txt | | | *----myfib.h |
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
文件,其中包含以下行: 添加库(MathFunctions mysqrt.cxx) 在CMakeLists.txt
库中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
文件,其中包含以下行: 添加库(MathFunctions mysqrt.cxx) 在CMakeLists.txt
库中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
文件,其中包含以下行: 添加库(MathFunctions mysqrt.cxx) 在CMakeLists.txt
库中MathFunctions
- 正如@n.m在评论中指出的,
采用atof
作为输入-斐波那契序列是使用float
生成的(因此int
更合适)atoi
- 对于您的示例,我不会使用设置编译器标志。更好的方法(项目范围)是使用
。(有set(CMAKE\u CXX\u FLAGS“-O0-g-Wall”)