我正在尝试使用计算给定数字的斐波纳契的示例项目来学习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
我哪里错了?
答案 0 :(得分:3)
你是否确实你因为你的构建系统而遇到了段错误?
您的代码需要输入,并且不检查输入是否为。来自fib.c:26
:
myfib(atof( argv[1] ));
如果没有给出参数,您的代码将尝试读取您未提供的数据(和段错误)。如果您运行代码:./fibonacci 3
,则会打印myfib
。我猜这就是你的问题所在。
需要考虑的其他事项:
Config.h.in
(这是获取编译示例所必需的)。 myfib.c
和myfib.h
位于不同的文件夹中。如果myfib.c
是MathFunctions
库的一部分,我会将源代码放入该子目录中。我在您认为您正在关注的教程中对此进行了解释: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
有效,但它并不是您正在做的工作的最佳工具。 :)