如何用 GCC, CMake 和 Make 编译C/C++代码
创始人
2024-05-31 17:50:49
0

参考资料:

  1. Makefile和CMakeLists的区别

  2. Cmake编写CmakeList.txt 语法备忘

文章目录

  • CMake & Make
  • CMakeLists 语法
  • Windows 下的缺点

CMake & Make

GCC(GNU Compiler Collection)是由 GNU 开发的编程语言编译器,可以在 Windows 和 Linux 等各种系统上编译代码。Windows 上的 Visual Studio 是个不错的编程工具,但是它有不少烦人的限制(比如不能内联汇编),而且它的 .sln.vcxproj 不能在 Linux 上使用。

  1. 我们结合两者优点,先使用 VS 的 CMake 项目 来编程,然后用 gcc 编译得到在各个平台通用的代码。但是 gcc 编译时,需要对各个文件进行排序,否则容易链接失败。

  2. 可以使用 make 工具,根据 Makefile 文件指定编译配置。不过,编写 MakeFile 也是一件体力活。

  3. 进一步,我们使用 CMake 工具,根据 CMakeLists.txt 文件来生成 MakeFile 文件。

  4. 注意,我们的编译是在 Linux 上进行的,在 Windows 上可以使用 WSL 直接对本地文件进行处理。

这样,就可以比较方便地用 gcc 编译大型工程了 ヾ(๑╹◡╹)ノ"

CMakeLists 语法

这里只介绍一些基本的语法,足够日常的使用了。

我不再详细地一一介绍,就写个简单的注释,备忘:

cmake_minimum_required(VERSION 3.10)	#指定最小版本project(MyProject C ASM)	#指定工程名称以及类型set(CMAKE_C_STANDARD 11)	#指定C11
set(CMAKE_CXX_STANDARD 11)	#指定C++11
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_Cxx_STANDARD_REQUIRED ON)enable_language(ASM)	#启用汇编
SET(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS asm)	#设置后缀set(CMAKE_BUILD_TYPE Release)	#设置Debug还是Releaseinclude_directories(SYSTEM) #设置include目录
link_directories(SYSTEM)    #设置static/dll目录#也可以设置为工作目录下的一些文件夹
include_directories(${PROJECT_SOURCE_DIR}/openssl) 
link_directories(${PROJECT_SOURCE_DIR}/openssl/lib ${PROJECT_SOURCE_DIR}/lib/)SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)  #设置exe文件目录,放置后续的add_executable结果
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib/)    #设置static/dll库目录,放置后续的add_library结果#nasm或yasm不支持-mavx2,-maes等指令,所以须前置
#但编译出的TIMER.a似乎链接不上?一直找不到func。其他的由C代码编译出的库可以正常链接
add_library(TIMER cputimer.asm)	#编译asm文件为静态库
add_library(TIMER SHARED cputimer.asm)	#编译asm文件为动态库#为后续的所有gcc命令设置编译参数
#这里的-lm,-lcrypto似乎没用?
add_compile_options(-w -O3 -lm -lssl -lcrypto -maes -mavx2-Wall -Wextra -Wpedantic -Wmissing-prototypes -Wredundant-decls -Wshadow -Wpointer-arith
)#将源文件分组(头文件不需要,已经被include写入源文件)
set(A_SRCS a1.c a2.c a3.c)
set(B_SRCS b1.c b2.c b3.c b4.c)
set(C_SRCS c1.c c2.c)
set(D_SRCS d1.c)#将测试文件分组
set(TEST_B_SRCS test_b.c)
set(TEST_C_SRCS test_c.c)
set(TEST_D_SRCS test_d.c)#递归执行src子目录下的CMakeLists.txt(如果有的话)
add_subdirectory(src)add_library(B ${A_SRCS} ${B_SRCS})			#编译出静态库
add_library(C SHARED ${A_SRCS} ${C_SRCS})	#编译出动态库
target_link_libraries(B PUBLIC m)  			#添加math库
target_link_libraries(C INTERFACE crypto)  	#添加openssl库#对于同样的代码,设置不同的宏
add_library(D128 ${D_SRCS})
add_library(D256 ${D_SRCS})
target_compile_definitions(D128 PUBLIC SAFETY=128)	#新建一个宏,取值128
target_compile_definitions(D256 PUBLIC SAFETY=256)	#新建一个宏,取值256link_libraries(m)	#后续的所有gcc指令都链接math库#编译各个main文件得到exe文件,并链接对应的库
add_executable(test_b ${B_SRCS})
add_executable(test_c ${C_SRCS})
add_executable(test_d128 ${D_SRCS})
add_executable(test_d256 ${D_SRCS})
target_link_libraries(test_b B)
target_link_libraries(test_c C)
target_link_libraries(test_d128 D128)
target_link_libraries(test_d256 D256)

为了让上述的 target_compile_definitions 起作用,需要这么写 .h 文件:

#ifndef SAFETY#define SAFETY  128		// 设置安全强度
#endif

编译步骤:

  1. 打开 WSL 进入工作目录
  2. 执行 cmake ./ 生成 MakeFile 文件
  3. 执行 make 编译工程代码
  4. 测试 /bin 内的 .exe 文件是否正确
  5. 库文件在 /lib

Windows 下的缺点

在 Windows 下使用 gcc, make, cmake 也可以,但是本人的工程代码(简单逻辑的代码没问题)出现了

internal error: aborting at ../../ld/ldlang.c:527 in compare_section

的错误,查了好多资料,还是搞不懂哪儿出错了(弱小又无助)

另外,Windows 下的 openssl 一直找不到 PATH 里写明了的 include 以及 lib 的位置,还要手动复制到工作目录下,烦死了 (╬ ̄皿 ̄)

相关内容

热门资讯

公司中秋晚会主持词 关于公司中秋晚会主持词  主持词分为会议主持词、晚会主持词、活动主持词、婚庆主持词等。在当今不断发展...
小学生职位竞选词 小学生职位竞选词  个人觉得竞选中队长,你已经很清楚中队长需要做的事情了,那么就从每一个任务来发展一...
在结婚典礼上的精彩幽默主持词 在结婚典礼上的精彩幽默主持词各位来宾:大家好!奉新郎新娘之命,我来主持今天的婚礼。为什么新郎新娘一定...
婚礼主持人搞笑台词 婚礼主持人搞笑台词  各位来宾:  大家好!奉新郎新娘之命,我来主持今天的婚礼,婚礼主持人搞笑台词。...
幼儿园运动会主持稿 幼儿园运动会主持稿  篇一:幼儿园运动会主持词  踏着春天的脚步,踩着春风的节拍,春天已经来到我们中...
小学庆元旦活动主持词 小学庆元旦活动主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。在当今社会生活中,...
爵士舞蹈串词主持词   爵士舞即美国现代舞,是一种急促又富动感的节奏型舞蹈,是属于一种外放性的舞蹈,不像古典芭蕾舞或现代...
幼儿园元旦节目主持词   齐x:亲爱的爸爸妈妈  周x:亲爱的爷爷奶奶  王x:亲爱的老师  李x:亲爱的小朋友们  合:...
运动会运动员赞美词 运动会运动员赞美词1.赞运动员是我们的目标,是我们的信念,在清凉的初秋,在喧嚣的田径场上,。你们点燃...
黄梅戏晚会的主持词 黄梅戏晚会的主持词  戏迷欢庆四一八 黄梅又添新奇葩  ——喜迎418暨欢庆黄梅戏艺术团成立的晚会台...
学校秋季运动会开幕主持词 学校秋季运动会开幕主持词(精选6篇)  主持词要注意活动对象,针对活动对象写相应的主持词。在当今社会...
庆祝五四文艺晚会主持稿 庆祝五四文艺晚会主持稿  男:尊敬的各位领导、来宾  女:电视机前的观众朋友们  合:大家好  男:...
最新品鉴会主持词 最新品鉴会主持词  鉴会现在开始!  女:各位领导,各位嘉宾  男:女士们、先生们  合:大家下午好...
端午节晚会主持词 精选端午节晚会主持词(通用8篇)  根据活动对象的不同,需要设置不同的主持词。时代不断在进步,很多场...
论坛一周年庆典晚会主持词 论坛一周年庆典晚会主持词  主持词是由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动和集...
最新研讨会主持词 最新研讨会主持词(通用11篇)  主持词分为会议主持词、晚会主持词、活动主持词、婚庆主持词等。在现在...
重阳节的主持词 重阳节的主持词  主持词分为会议主持词、晚会主持词、活动主持词、婚庆主持词等。在人们越来越多的参与各...
记者节活动主持词 记者节活动主持词(精选7篇)  主持词没有固定的格式,他的最大特点就是富有个性。在现今人们越来越重视...
高校运动会开幕式精彩致辞 高校运动会开幕式精彩致辞  在平平淡淡的学习、工作、生活中,大家肯定对各类致辞都很熟悉吧,致辞具有思...