这里笔者故意挑了1个最新的libiconv,这是为了将CMake编译的相关内容巩固一下。对于libiconv,其下载地址见上篇博客。网上资料称支持VS编译的最后一个版本为1.11.1,但笔者偏不信这个邪,就要用最新版的,那就涉及到CMake的编写工作了。事先声明:笔者的CMake及相关内容参照了libiconv-1.11.1-windows编译-CSDN博客以及Windows下用CMake搞定libiconv-1.11.1编译VS2008/2015双版本实战-CSDN博客,如有需要请参考相应原文。在开始编写相关CMake之前,首先来看一下libiconv-1.19的文件结构:其中,标红的lib和libcharset是需要重点关注的内容。而实际上,真正有用的C文件只有libcharset/lib/localcharset.c以及lib/iconv.c两个,因此,后面的CMake也主要围绕这两个文件展开。下面就开始对CMakeLists.txt的编写和讲解。注意:该CMake并非最终版本,在后面很可能会对其进行相应修改,当然,笔者会讲解相应的修改步骤,力求探索出最佳效果。(0).在libiconv-1.19的库文件夹中新建CMakeLists.txt,以下内容均在该文件中进行编辑。(1).给libiconv-1.19制定总体编译规则并形成项目cmake_minimum_required(VERSION 3.19) cmake_policy(SET CMP0115 NEW) project(iconv LANGUAGES C CXX) set(ICONV_VERSION 1.19)首先,要求该工程的CMake版本至少为3.19;之后设置CMake策略CMP0115为NEW,这里要说一下CMP0115,它与源文件的扩展名有关,由于笔者这里并不打算使用库文件夹中的子文件夹tests中用于测试的C代码,所以后面笔者会在该库文件夹中另外创建1个名为iconv_demo的CPP文件,所以这就涉及到了两种源文件:C和CPP,将CMP0115设为NEW,就是要求源文件扩展名更明确;然后,将该工程取名为iconv,由上所知涉及的语言自然有两种:C和CPP(即CXX);最后,定义libiconv的版本号ICONV_VERSION为1.19,在接下来设置安装目录时便会用到这一变量。(2).设置安装目录的相关字符串set(INSTALL_INC_DIR ${CMAKE_INSTALL_PREFIX}/include/iconv-${ICONV_VERSION} CACHE PATH Installation directory for headers) set(INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/iconv-${ICONV_VERSION} CACHE PATH Installation directory for libraries) set(INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/bin/iconv-${ICONV_VERSION} CACHE PATH Installation directory for executables)先说共性:CACHE表示放入CMake缓存中,PATH说明相关变量类型为路径,这两点就意味着用户可在CMakeGUI/ccmake中能够修改它;位于上述3个语句最后的字符串为相关的说明性字符串;另外,还应注意的是:0.对于CMakeLists.txt中的某个变量X,调用方式为${X}1.对于CMAKE_INSTALL_PREFIX,其代表的是CMake的安装根目录,也就是生成相应目标文件的根目录再说个性:0.INSTALL_INC_DIR:安装头文件的目录1.INSTALL_LIB_DIR:安装库文件的目录,针对Windows的MSVC中,该目录通常放置静态库/DLL的导入库(其实就是.lib文件的安置地)2.INSTALL_BIN_DIR:设置安装可执行文件目录,也就是Windows中DLL的安置地(3).设置类库中需要使用的头文件及需要编译的源文件的路径set(iconv_pub_inc include/iconv.h.in) set(charset_pub_inc libcharset/config.h.in libcharset/include/localcharset.h.in) set(lib_pub_inc lib/config.h.in) set(charset_priv_src libcharset/lib/localcharset.c) set(lib_priv_src lib/iconv.c)细心的你会发现,上面的.h文件后面还有个.in的后缀。实际上,大家拿到的libiconv-1.19中的相关文件就是长这个样子的,暂时不用担心;另外,上述操作实际上就是在将后面编译所用到的头文件及源文件的路径分门别类地放到不同的列表变量中,方便后续使用。(4).创建静态库目标,并给其设置包含路径add_library(iconvlib STATIC ${iconv_pub_inc} ${charset_pub_inc} ${charset_priv_src} ${lib_pub_inc} ${lib_priv_src} ) target_include_directories(iconvlib PUBLIC include libcharset/include libcharset)这里要注意的是:虽然头文件本身不参与编译生成目标文件,可不用加入所生成的目标文件夹中,但将之加入其中有两个好处:0.VS中可见1.方便IDE管理和浏览源码换句话说,针对add_library,_inc结尾的都是头文件的路径;而_src结尾的都是源文件的路径,也就是真正的编译项(与前述正好相互印证)。target_include_directories用来给目标设置包含路径,而其中的PUBLIC保证了在编译iconvlib时,或者其他目标链接iconvlib时,都可用PUBLIC后面的用于包含头文件的目录。这里说一说PUBLIC,它就好像C中继承与派生中的public属性一样;只不过,将此概念迁移到CMake中,表示当前目标自己需要这些include路径;链接当前目标的其他目标也需要继承这些include路径。(5).创建动态库目标,并给其设置包含路径及添加相关编译宏add_library(iconvdll SHARED ${iconv_pub_inc} ${charset_pub_inc} ${charset_priv_src} ${lib_pub_inc} ${lib_priv_src} ) target_include_directories(iconvdll PUBLIC include libcharset/include libcharset) target_compile_definitions(iconvdll PRIVATE DLL_EXPORT BUILDING_LIBICONV ICONV_CONST)首先,这里的SHARD指的是:在Windows的MSVC下,会生成运行时加载的动态链接库以及链接时使用的导入库;而target_compile_definitions用来给目标添加编译宏的,后面在生成目标时会讲到相应的源码,那时这些宏的作用便一目了然了,这里先卖个关子。
Qt实现DXF读入与图形编辑(2)-VS2022+CMake编译libiconv-1.19(0)-libiconv-1.19简介及CMake的编写(0)
发布时间:2026/6/2 1:15:39
这里笔者故意挑了1个最新的libiconv,这是为了将CMake编译的相关内容巩固一下。对于libiconv,其下载地址见上篇博客。网上资料称支持VS编译的最后一个版本为1.11.1,但笔者偏不信这个邪,就要用最新版的,那就涉及到CMake的编写工作了。事先声明:笔者的CMake及相关内容参照了libiconv-1.11.1-windows编译-CSDN博客以及Windows下用CMake搞定libiconv-1.11.1编译VS2008/2015双版本实战-CSDN博客,如有需要请参考相应原文。在开始编写相关CMake之前,首先来看一下libiconv-1.19的文件结构:其中,标红的lib和libcharset是需要重点关注的内容。而实际上,真正有用的C文件只有libcharset/lib/localcharset.c以及lib/iconv.c两个,因此,后面的CMake也主要围绕这两个文件展开。下面就开始对CMakeLists.txt的编写和讲解。注意:该CMake并非最终版本,在后面很可能会对其进行相应修改,当然,笔者会讲解相应的修改步骤,力求探索出最佳效果。(0).在libiconv-1.19的库文件夹中新建CMakeLists.txt,以下内容均在该文件中进行编辑。(1).给libiconv-1.19制定总体编译规则并形成项目cmake_minimum_required(VERSION 3.19) cmake_policy(SET CMP0115 NEW) project(iconv LANGUAGES C CXX) set(ICONV_VERSION 1.19)首先,要求该工程的CMake版本至少为3.19;之后设置CMake策略CMP0115为NEW,这里要说一下CMP0115,它与源文件的扩展名有关,由于笔者这里并不打算使用库文件夹中的子文件夹tests中用于测试的C代码,所以后面笔者会在该库文件夹中另外创建1个名为iconv_demo的CPP文件,所以这就涉及到了两种源文件:C和CPP,将CMP0115设为NEW,就是要求源文件扩展名更明确;然后,将该工程取名为iconv,由上所知涉及的语言自然有两种:C和CPP(即CXX);最后,定义libiconv的版本号ICONV_VERSION为1.19,在接下来设置安装目录时便会用到这一变量。(2).设置安装目录的相关字符串set(INSTALL_INC_DIR ${CMAKE_INSTALL_PREFIX}/include/iconv-${ICONV_VERSION} CACHE PATH Installation directory for headers) set(INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/lib/iconv-${ICONV_VERSION} CACHE PATH Installation directory for libraries) set(INSTALL_BIN_DIR ${CMAKE_INSTALL_PREFIX}/bin/iconv-${ICONV_VERSION} CACHE PATH Installation directory for executables)先说共性:CACHE表示放入CMake缓存中,PATH说明相关变量类型为路径,这两点就意味着用户可在CMakeGUI/ccmake中能够修改它;位于上述3个语句最后的字符串为相关的说明性字符串;另外,还应注意的是:0.对于CMakeLists.txt中的某个变量X,调用方式为${X}1.对于CMAKE_INSTALL_PREFIX,其代表的是CMake的安装根目录,也就是生成相应目标文件的根目录再说个性:0.INSTALL_INC_DIR:安装头文件的目录1.INSTALL_LIB_DIR:安装库文件的目录,针对Windows的MSVC中,该目录通常放置静态库/DLL的导入库(其实就是.lib文件的安置地)2.INSTALL_BIN_DIR:设置安装可执行文件目录,也就是Windows中DLL的安置地(3).设置类库中需要使用的头文件及需要编译的源文件的路径set(iconv_pub_inc include/iconv.h.in) set(charset_pub_inc libcharset/config.h.in libcharset/include/localcharset.h.in) set(lib_pub_inc lib/config.h.in) set(charset_priv_src libcharset/lib/localcharset.c) set(lib_priv_src lib/iconv.c)细心的你会发现,上面的.h文件后面还有个.in的后缀。实际上,大家拿到的libiconv-1.19中的相关文件就是长这个样子的,暂时不用担心;另外,上述操作实际上就是在将后面编译所用到的头文件及源文件的路径分门别类地放到不同的列表变量中,方便后续使用。(4).创建静态库目标,并给其设置包含路径add_library(iconvlib STATIC ${iconv_pub_inc} ${charset_pub_inc} ${charset_priv_src} ${lib_pub_inc} ${lib_priv_src} ) target_include_directories(iconvlib PUBLIC include libcharset/include libcharset)这里要注意的是:虽然头文件本身不参与编译生成目标文件,可不用加入所生成的目标文件夹中,但将之加入其中有两个好处:0.VS中可见1.方便IDE管理和浏览源码换句话说,针对add_library,_inc结尾的都是头文件的路径;而_src结尾的都是源文件的路径,也就是真正的编译项(与前述正好相互印证)。target_include_directories用来给目标设置包含路径,而其中的PUBLIC保证了在编译iconvlib时,或者其他目标链接iconvlib时,都可用PUBLIC后面的用于包含头文件的目录。这里说一说PUBLIC,它就好像C中继承与派生中的public属性一样;只不过,将此概念迁移到CMake中,表示当前目标自己需要这些include路径;链接当前目标的其他目标也需要继承这些include路径。(5).创建动态库目标,并给其设置包含路径及添加相关编译宏add_library(iconvdll SHARED ${iconv_pub_inc} ${charset_pub_inc} ${charset_priv_src} ${lib_pub_inc} ${lib_priv_src} ) target_include_directories(iconvdll PUBLIC include libcharset/include libcharset) target_compile_definitions(iconvdll PRIVATE DLL_EXPORT BUILDING_LIBICONV ICONV_CONST)首先,这里的SHARD指的是:在Windows的MSVC下,会生成运行时加载的动态链接库以及链接时使用的导入库;而target_compile_definitions用来给目标添加编译宏的,后面在生成目标时会讲到相应的源码,那时这些宏的作用便一目了然了,这里先卖个关子。