使用CMAKE在C语言中创建静态库

时间:2018-12-06 14:06:50

标签: c cmake

我的项目的结构如下:

  
      
  • 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)
  • 如何添加包含路径(DriverFolder / Inc和ApplicationFolder / Inc?
  • 为了生成库,我还应该在CMakeLists.txt中添加/修改什么?

1 个答案:

答案 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

请注意,这仅使将源文件构建为目标文件成为可能。它不会在库中包含头文件,也不会自动将它们安装在任何地方。