gpt4 book ai didi

CMake Noob 段错误问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:24:37 25 4
gpt4 key购买 nike

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

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

我哪里错了?

最佳答案

真的确定是因为您的构建系统导致了段错误吗?

您的代码需要输入,而您没有检查是否提供了输入。来自 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图书馆。

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

  • 对于你的例子,我不会使用 add_definitions 设置编译器标志。更好的方法(在项目范围内)是使用 set ( CMAKE_CXX_FLAGS "-O0 -g -Wall") . (有很多 useful CMake Variables )。同时 add_definitions工作,它不是你正在做的工作的最佳工具。 :)

关于CMake Noob 段错误问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19341650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com