hw01
hw01 copied to clipboard
高性能并行编程与优化 - 第01讲回家作业
在stb_image_write.cpp中先define`STB_IMAGE_WRITE_IMPLEMENTATION` ,在#include"stb_iamge_write.h",相当于通过宏实现对函数的实现 在stbiw/CmakeLists.txt文件里,add_library(stbiw STATIC stb_image_write.cpp)#添加动态库 target_include_directories(stbiw PUBLIC .)#include的时候可以在当前目录搜索
因为自己的疏忽大意,没有看清楚本来已经在README.md文件中说明的可能会引起错误的原因导致迟迟不能编译通过。 最终反复看了README.md才恍然大悟。 说实话对于在windows下用cmake生成的工程使用起来还是有些不太熟悉,主要不太明白生成的几个工程文件(ZERO_CHECK, ALL_BUILD等都是应该怎么用的)。 如果老师有时间的话,能否关于这些做一个几分钟的简单讲解,那就太好了。
为了回应作业要求,简单看了下与 stb 以及设计原则相关的两个仓库,发现仓库的设计相当有趣。在 cmake 的构建过程中,通过 自己定义 stbw/stbw_config.cpp 文件,将 .h 文件通过宏命令静态切换为实现版本,再生成对应的静态/动态链接库(可以发现 build/stbw/ 目录下的 libstbw.a 文件)。最后,通过 cmake 来链接起项目中源文件,实现了 .h 单文件中接口声明与实现的分离(cpp程序只需要 include 接口版本,链接实现版本生成的链接库)。 我想了想,这样做的好处在于: 1. 项目文件简洁:虽然按照传统的 头文件声明-cpp文件实现 的策略一样可以达成这接口-实现的分离,但是文件多起来难免看起来不那么简洁优雅。 2. 取消文件依赖关系:单个头文件中完成接口和实现,用宏命令分隔,cpp 文件仅起定义用户配置的作用,取消了项目文件之间的依赖关系,使用不易出错。 坏处可能是: 1....
stbi为什么使用了 `STB_IMAGE_WRITE_IMPLEMENTATION` 和'INCLUDE_STB_IMAGE_WRITE_H'这两个宏进行条件编译?我个人理解,这是一种“解耦”的设计,提高编译速度、减少可执行文件大小----试想一下,如果不通过宏控制函数定义,每个#include 都要编译一遍(虽然函数是static的,可重复定义),每个都要编译一遍,会增加编译时间,同时增加可执行文件的体积。这个有些像是PIMPL的思想。 其他的,就是根据小彭老师课程内容,完成的常规的操作。
参考了其他同学的代码
Finished hw01! Learned about the use of CMake.
1.创建cpp,cpp中只需要include 就可以,cpp文件用来编译动态链接库,add_library(stbiw SHARED stb_image_write.cpp) 2. 使用PUBLIC的target_include_directories,将所有链接了stbiw.so的target都从stbiw中搜索头文件,target_include_directories(stbiw PUBLIC ./) 3. 使用target_compile_definitions定义动态链接库的宏以编译stbi_write_png()这些函数,这里需要注意使用PRIVATE属性,否则会多重定义,因为前面还include了多次这个库的头文件,而函数的定义就在头文件中,所以会编译很多次。这里用PRIVATE不会将宏传递出去,只会在库编译时定义一次函数。
2023-01-31 -创建stb_image_write.cpp,并在CMakeLists.txt中创建stbiw库,包含cpp和h文件 -target_include_directories引入h文件的路径,保证main所在的项目可以让CMake通过链接stbiw时找到对应头文件 -stbiw是C风格库,前一半为函数声明,后一半为函数定义,其中函数定义被宏STB_IMAGE_WRITE_IMPLEMENTATION包含起来,当且仅当此宏被定义是,编译器才读取定义并给出编译结果,否则相当于仅仅读取一个包含了一系列函数声明的头文件,从而实现在一个给定区域通过STB_IMAGE_WRITE_IMPLEMENTATION定义函数,其他地方仅引入头文件用于编译通过的目的
1.header文件无法直接编译成库,在cpp文件中include,再生成libstbiw.a 2.为了可以直接include子文件的header文件,使用target_include_directories PS.只实现了基础的要求,阅读其他同学作业获得了很多收获