我的项目的结构如下:
DriverFolder
Src
- “ myDriver.c”
Inc
- “ myDriver.h”
ApplicationFolder
Src
- “ myApplication.c”
Inc
- “ myApplication.h”
“ myApplication.c”源文件包含以下代码:
#include "myApplication.h"
#include "myDriver.h" // Driver included from DriverFolder
uint8_t myFunction(void)
{
uint8_t fooValue = getValueFromDriver(); // A function in myDriver.h
return fooValue;
}
头文件“ myApplication.h”包含宏和原型
#ifndef LIBRARY_MYAPPLICATION_H
#define LIBRARY_MYAPPLICATION_H
uint8_t myFunction(void);
#endif
我想使用CMAKE创建一个静态库(.lib)。我的目标是将此库包含在另一个项目中。另一个项目如下所示:
#include "myApplication.h"
int main(void)
{
printf("%d", myFunction());
return 0;
}
我想知道如何准备CMakeLists.txt。现在,这就是我所拥有的:
cmake_minimum_required(VERSION 3.0.0)
project(MYAPPLICATION VERSION 0.1.0)
add_library(MYAPPLICATION STATIC myDriver.c myApplication.c)
答案 0 :(得分:1)
静态库实际上只是对象文件的存档。因此,它们本身不包含头文件。而是在分发或安装库时,还需要分发或安装公共头文件。不需要的是在创建实际库时列出头文件,因此根本不需要添加它们。
此外,如果仅使用列出的源文件(class Utils
{
readonly MainWindow mainWindow;
public Utils(MainWindow mainWindow)
{
this.mainWindow = mainWindow ?? throw new ArgumentNullException(nameof(mainWindow));
}
}
class MainWindow
{
readonly Utils utils;
public MainWindow()
{
InitilaizeComponent();
utils = new Utils(this);
}
}
和myDriver.c
)创建的目标文件是实际的静态库,那么显示的myApplication.c
文件就是全部需要生成库。
如评论中所述,实际上缺少一些有助于构建库所需的目标文件的东西。从目标文件创建静态库本身很好。
问题在于您的头文件位于非标准位置,并且编译器预处理器将无法找到与源文件不在同一目录中的文件。
这意味着您必须告诉CMake添加标志,这些标志告诉编译器头文件位于何处。您可以使用target_include_directories
命令来完成此操作。
并且您还需要列出源文件的完整(相对)路径。
因此CMakeLists.txt
文件应该看起来像这样:
CMakeLists.txt
请注意,这仅使将源文件构建为目标文件成为可能。它不会在库中包含头文件,也不会自动将它们安装在任何地方。