这是我的工作目录:
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?
答案 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>
代替。
希望这有帮助