正确设置cmakelist以编译项目

时间:2016-04-13 01:35:35

标签: c compilation makefile cmake

这是我的工作目录:

app
|___include
  |___file1.h
  |___file2.h
  |___file3.h
  !___ ...
|___src
  |___file1.c
  |___file2.c
  |___file3.c
  |___ ...
|__CMakeLists.txt
|__mainapp.c

这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.5.1)
project(app)
include_directories(include)
file(GLOB SOURCES src/*.c)
add_executable(file3 src/file3.c)
target_link_libraries(file3 m ${SOURCES})

然后我执行以下操作:

$cmake .
$make

但我得到错误:

[ 50%] Building C object CMakeFiles/file3.dir/src/file3.c.o
[100%] Linking C executable file3
src/file3.c:1:19: fatal error: file1.h: File does not exist

file3.c只是:

#include "file1.h"
#include "file2.h"

int foo3(int a, int b){
    return foo1(a,b) + foo2(a,b);
}

如何正确设置CMakeLists?

2 个答案:

答案 0 :(得分:1)

您正在将源文件链接到可执行文件,但您应该编译它们。

target_link_libraries(file3 m ${SOURCES})

通常,您将所有源文件放入add_executable进行编译,并且只将链接库(如m(libm用于数学函数))放入。

add_executable(file3 ${SOURCES})
target_link_libraries(file3 m)

这当然只有在其他文件都不包含主函数时才有效。

您的include_directories(include)作为编译期间使用的-Iinclude附加到gcc调用。 https://gcc.gnu.org/onlinedocs/cpp/Include-Syntax.html。您可以使用make VERBOSE = 1来查看您的gcc调用。

在链接期间,gcc不再看那里,这就是为什么它告诉你它无法找到该功能(之后它可能会在其他地方失败)

您还可以使用您的源构建一个库,并将您的可执行文件链接到该库。但是,不要将文件3包含在库的来源中。

答案 1 :(得分:0)

使用

#include "file1.h"

在当前目录中搜索file.h,而不在其他包含的目录中搜索。

使用

#include <file.h>

代替。

希望这有帮助