如何从仅标头的库中构建静态库

时间:2018-10-22 10:38:34

标签: c build cmake

我正在尝试构建项目stb的静态库,因此可以将其链接到另一个项目(不是用C / C ++编写)中。

我已经创建了CMakeLists.txt文件以使用CMake进行构建,但是构建的静态库文件为空。

我怀疑这是由于stb似乎是 header-only 库。我尝试使用LIBRARY_HEADER_ONLY设置target_compile_definitions标志,但这不能解决我的问题。

如何将仅标头的库构建为静态库文件(* .a)?甚至有可能吗?如果没有,有什么解决方法?

这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(stb C)

set(MAKE_GENERATOR_PLATFORM x64)
set(CMAKE_C_FLAGS -m64)
set(CMAKE_CXX_FLAGS -m64)

option(STB_IMAGE_IMPLEMENTATION "stb_image implementation" ON)

if(STB_IMAGE_IMPLEMENTATION)
    add_definitions(-DSTB_IMAGE_IMPLEMENTATION)
endif()

option(POSITION_INDEPENDENT_LIB "Use position independent code for static library (if applicable)" ON)
set(SOURCE_FILES stb_image.h stb_truetype.h stb_dxt.h)

add_library(stb_static STATIC ${SOURCE_FILES})
target_compile_definitions(stb_static PUBLIC LIBRARY_HEADER_ONLY)
set_target_properties(stb_static PROPERTIES LINKER_LANGUAGE C)
set_target_properties(stb_static PROPERTIES
        OUTPUT_NAME stb
        POSITION_INDEPENDENT_CODE ${POSITION_INDEPENDENT_LIB})

1 个答案:

答案 0 :(得分:0)

要获取目标文件并从 header-only库构建静态库,必须存在额外的.c文件。这是因为.c文件是包含说明和代码的文件。

不同的工具链可能对.h文件的解释不同,因此创建实现的简便方法是创建一个新的.c文件。

#define STB_IMAGE_IMPLEMENTATION
#define STB_DXT_IMPLEMENTATION
#define STB_TRUETYPE_IMPLEMENTATION

#include "stb_image.h"
#include "stb_dxt.h"
#include "stb_truetype.h"

包括头文件(stb_image.h)并在STB_IMAGE_IMPLEMENTATION文件中定义所需的宏(.c)是解决方案,可将目标文件和静态库(具有适当的内容)取出版本。