Mess_GCC基本命令与链接库

为什么会写这个无聊的东西?
主要是老师让我们用 Lex 做词法分析…
然后老师教程里给的 Lex.yy.c -> a.out 这一步是用 VC6.0 做的… 我又不想装 VC…
感觉为了做一个小实验装个软件太蠢…
我想,那行吧,趁着这个机会学学 gcc 手动编译怎么用?
参考:https://www.cnblogs.com/linuxAndMcu/p/11226900.html
https://www.cnblogs.com/lcchuguo/p/5164362.html
https://blog.csdn.net/sinat_36219858/article/details/80348889
https://www.cnblogs.com/king-lps/p/7757919.html

  • 什么是 mingw64 ?
    Minimalist GNU for Windows 64 大名鼎鼎的 gcc 编译器的 windows 版本
  • 编译过程中会产生的中间文件有哪一些?
// .c -----> .i -----> .s -------> .o --------> .exe/.out
//   预处理      编译        汇编         链接
  • gcc 的基本命令有哪些?
    基本的命令格式为 gcc [选项] [参数]
// 选项
// 无选项 .c -> .exe/.out,此时由于没有 -o 默认为 a.exe/a.out
// -E	.c -> .i 预处理
// -S 	.i -> .s 编译成汇编码
// -c	.s -> .o 汇编成机械码
// -o	.o -> .exe/.out	这个选项即可以和上面的选项一起使用用于指定目标文件名,也可以执行链接(其实就是一步到位的带参数版...)
// e.g: gcc test.o -o test 注意此时是没有后缀的,其他步骤都得加后缀,我猜测跟系统有关
// -I <dir>	在头文件的搜索目录添加 dir 目录
// -L <lib_dir> 在库文件的搜索目录添加 dir 目录
// -l<libname>	链接库文件

值得好好解释一下的是 -l 选项,它指示 GCC 去连接库文件 libfoo.so 。 Linux 下的库文件在命名时有一个约定,那就是应该以lib 三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-l 选项指定链接的库文件名时可以省去lib 三个字母,也就是说GCC 在对-lfoo 进行处理时,会自动去链接名为libfoo.so 。
Linux下的库文件分为两大类分别是动态链接库(通常以.so 结尾)和静态链接库(通常以.a 结尾),两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的 。默认情况下,GCC 在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static 选项,强制使用静态链接库。

  • 什么是动态库,什么是静态库?
    静态库是在链接的时候进行链接的,动态库是在执行的时候才进行链接
    它们一个很大的不同就是,静态链接后库被删除了程序还能执行,而动态链接不行
  • 动态库与静态库的优缺点?
    上面那个问答可能会让你觉得动态库一无是处,其实不是的。静态链接之所以能够做到没有库也能运行程序,是因为库本身被嵌入到程序中了。
    这就带来了两个很大的问题
    浪费空间,因为可能不同的程序用着同一个库
    库出问题或者需要更新的时候,程序得重新编译
    动态库的缺点也是有的:

    虽然动态库也有着一些不足,但是在当今这个版本快速迭代的时代,链接还是用的动态库比较多
  • 如何编译时链接某个目录中的库?
    源文件中:#pragma commit(lib, "../Debug/libtest.lib(路径示范)")
    或?(这两件事只用做一件就可以了吧?我不确定…但是我是这么想的)
    编译器链接:gcc test.c -L <lib_dir> -l<libName> -o test
    https://blog.csdn.net/qq_33757398/article/details/81544087
  • 使用静态库的时候需要头文件吗?
    我觉得这取决于你写静态库的时候是把 函数的声明和实现是不是写在一起?
    像我们普通调用 C 语言的标准库的时候,因为标准库的库体中是只写了实现而没有写声明的,所以我们在链接的时候需要在源文件中加上它的声明(include);但是如果我们写静态库的时候将声明和实现放在了一起,那么我们直接链接库就可以了吧?
    https://zhidao.baidu.com/question/2271565000563520148.html
  • 静态库还有分类型的?
    一种静态库中有代码实现,用于直接作静态链接
    一种静态库中没有代码,类似头文件?用于调用动态库
    https://baike.baidu.com/item/lib/2395664?fr=aladdin
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个 MySQL 存储过程的示例,用于统计选课表 mess_xk 中每门课程的选课人数及平均成绩: ```mysql DELIMITER // CREATE PROCEDURE course_stats() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE course_name VARCHAR(255); DECLARE total_score FLOAT; DECLARE total_count INT; DECLARE course_cursor CURSOR FOR SELECT DISTINCT course FROM mess_xk; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; DROP TABLE IF EXISTS course_stats; CREATE TEMPORARY TABLE course_stats ( course VARCHAR(255), count INT, avg_score FLOAT ); OPEN course_cursor; course_loop: LOOP FETCH course_cursor INTO course_name; IF done THEN LEAVE course_loop; END IF; SET total_score = 0; SET total_count = 0; SELECT COUNT(*) INTO total_count FROM mess_xk WHERE course = course_name; SELECT SUM(score) INTO total_score FROM mess_xk WHERE course = course_name; INSERT INTO course_stats (course, count, avg_score) VALUES (course_name, total_count, total_score / total_count); END LOOP; CLOSE course_cursor; SELECT * FROM course_stats; END // DELIMITER ; ``` 这个存储过程首先定义了一些变量和游标。然后创建了一个名为 course_stats 的临时表,用于存储每门课程的统计信息。接下来定义了一个名为 course_cursor 的游标,用于遍历选课表 mess_xk 中的所有课程。然后在循环中,先获取当前课程的选课人数和总成绩,然后计算平均成绩,并将结果插入到 course_stats 表中。最后关闭游标,输出 course_stats 表中的数据。 您可以将上述代码复制到 MySQL 的命令行或者客户端工具中执行。注意,在执行存储过程之前,需要先创建一个名为 mess_xk 的表,并插入一些数据用于测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值