我正在尝试构建项目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})
答案 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
)是解决方案,可将目标文件和静态库(具有适当的内容)取出版本。