我正在尝试构建项目的静态库 stb ,所以我可以将它链接到另一个项目(不是用 C/C++ 编写的)。
我已经创建了 CMakeLists.txt 文件来使用 CMake 构建它,但是构建的静态库文件是空的。
我怀疑这是因为 stb 似乎是header-only 库。我尝试使用 target_compile_definitions
设置 LIBRARY_HEADER_ONLY
标志,但这并没有解决我的问题。
如何将仅 header 库构建为静态库文件 (*.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})
要获取目标文件并从仅 header 库 构建静态库,额外的.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"
在 .c
文件中包含头文件 (stb_image.h
) 和定义所需的宏 (STB_IMAGE_IMPLEMENTATION
) 是解决方案从构建中获取目标文件和静态库(具有适当的内容)。
我是一名优秀的程序员,十分优秀!