1.2 编译基础知识

成功编译GDAL2.1.1过程总结 如果只是为了使用GDAL,下载桌面快捷版就可以了。(参考网站:http://gmt-china.org/blog/gdal-ogr/) 如果是为了后续编译osg,则需要注意OSG和GDAL的版本对应关系,以及GDAL所能支持的最高VS版本。 笔者在Windows7 32位系统下,使用了vs2010命令提示符窗口,成功编译了gdal2.1.1。在C盘生成了三个bin,data,html文件。GDA 阅读详情

一、编译简介

项目编译都经历了两个阶段:编译、链接

  • 无论项目多么庞大, 编译都是单文件编译,且编译时不用管函数实现,只需知道函数定义即可,所以编译要找到对应的头文件。(编译时用00占位符,表示函数地址)
  • 链接才支持多文件输入, 这阶段会修正函数地址,将上面的00修改为函数的真正地址。静态库链接不是将静态库的内容全部复制,只有用到才会复制。

库类型:

  • 静态库:是一个归档文件,即打包文件。可以对其进行解压,解压后的.o文件再和自己功能.o文件,重新打包成新的静态库。静态库里面的函数地址还是00,所以打包静态库不涉及链接操作(即编译+打包)
  • 动态库:函数地址不是00,但也不是真正的函数地址,是符号表的地址,动态库是通过符号表跳转到函数真正地址。(Linux的动态库是将函数符号信息和函数实现放在一个文件,而Windows的MSVC是分开两个文件dll和import lib)

二、头文件和依赖库搜索路径

2.1 头文件

(1)默认搜索路径

编译器(如gcc、clang)会按照如下顺序搜索头文件:

  1. 当前目录:对与使用双引号#include "header.h"的情况,编译器会首先在源文件所在目录查找。
  2. 标准系统路径:对于使用尖括号#include <header.h>的情况,编译器会查找系统默认路径,通常包括:
    • /usr/include
    • /usr/local/include
    • 编译器内置路径(如/usr/lib/gcc/x86_64-linux-gnu/<version>/include)

(2)自定义搜索路径

通过编译器选项 指定头文件搜索路径:

  • I<路径>:指定头文件搜索的目录,优先级高于系统默认路径
    • 示例:gcc -I./include main.c
  • -isystem <路径>:指定系统头文件路径,优先级低于 -I 但高于标准路径
  • 环境变量:某些编译器会参考环境变量 CPATH 或 C_INCLUDE_PATH(C 程序)或 CPLUS_INCLUDE_PATH(C++ 程序)来查找头文件。
    • 示例:export C_INCLUDE_PATH=/path/to/include

2.2 库文件

2.2.1 链接阶段

(1)默认搜索路径

链接器通常会搜索以下标准路径:

  • /lib
  • /usr/lib
  • /usr/local/lib
  • 编译器特定的库路径(如 /usr/lib/gcc/x86_64-linux-gnu/<version>)
(2)自定义搜索路径

通过编译器选项 指定库搜索路径:

  • -L<路径>:在链接时指定库文件的路径,优先级高于系统默认路径
    • 示例:gcc main.c -L./libs -lmylib
  • 环境变量LIBRARY_PATH:链接器会参考 LIBRARY_PATH 环境变量指定的路径。
    • 示例:export LIBRARY_PATH=/path/to/libs
  • 使用 -l<库名> 指定要链接的库,链接器会自动在搜索路径中查找 lib<库名>.a 或 lib<库名>.so
    • 示例:-lm表示链接 libm.so 或 libm.a(数学库)。

2.2.2 运行阶段(动态链接)

  • 程序中指定的 RPATH:编译时通过 -rpath或--rpath选项嵌入到可执行文件中的路径。
    • 示例:gcc -Wl,-rpath,/path/to/libs main.c
  • LD_LIBRARY_PATH 环境变量:运行时指定的动态库路径,优先级高于系统默认路径。
    • 示例:export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
  • /etc/ld.so.cache:由ldconfig工具生成,缓存了系统默认路径中的库信息。
    • 通常包括 /lib、/usr/lib、/usr/local/lib 等
    • 将/etc/ld.so.conf 或 /etc/ld.so.conf.d/*.conf 中配置的路径加入缓存
    • 查看当前动态库缓存:ldconfig -p
    • 更新动态库缓存:sudo ldconfig
  • 系统默认路径:如/lib、/usr/lib

2.3 常见问题与解决方法

  • 头文件未找到:
    • 检查头文件路径是否正确,使用 -I 指定路径。
    • 确保头文件与源代码的 #include 语法匹配(双引号或尖括号)。
  • 库文件未找到(链接时):
    • 使用 -L 指定库路径,检查库文件是否存在。
    • 确保 -l 指定的库名正确(去掉 lib 前缀和 .a/.so 后缀)。
  • 动态库未找到(运行时):
    • 检查 LD_LIBRARY_PATH 或 RPATH 设置。
    • 确保动态库已安装并在 ldconfig 缓存中。
    • 使用 ldd 检查依赖是否正确解析。

三、如何指定静态链接和动态链接

3.1 静态链接

静态链接是指在编译时将库的代码直接嵌入到生成的可执行文件中,生成的可执行文件包含了所有需要的代码,运行时无需依赖外部库文件。

注意:不是将库的所有代码嵌入,而是程序用到的函数代码

常见方式:

  • 使用-static选项,强制使用静态库链接
    • 示例:gcc main.c -o myprogram -static # 会链接静态运行时库
  • 用静态库全名
    • 示例:gcc main.c -L/path/to/lib -l:libexample.a -o myprogram

3.2 动态链接

动态链接是指在编译时仅在可执行文件中记录对动态库(.so 文件)的引用,运行时动态加载这些库。动态链接是大多数编译器的默认行为。

常见方式:

  • 默认行为: GCC 和 Clang 默认使用动态链接,因此通常不需要额外指定。
  • 显式指定动态库:使用 -l 选项指定动态库名称(去掉 lib 前缀和 .so 后缀)
    • 示例:gcc main.c -L/path/to/lib -lexample -o myprogram

3.3 混合链接

在某些情况下,可以混合使用静态和动态链接。例如,强制链接某些库为静态,而其他库保持动态。可以使用 -Wl,-Bstatic 和 -Wl,-Bdynamic 选项来控制:

  • -Wl,-Bstatic:接下来的 -l 指定的库将以静态方式链接。
  • -Wl,-Bdynamic:接下来的 -l 指定的库将以动态方式链接。

示例:

gcc -o program source.o -L/usr/local/lib -Wl,-Bstatic -lexample -Wl,-Bdynamic -lanother
  • libexample.a 将被静态链接。
  • libanother.so 将被动态链接。
用mingw静态编译Qt4.8.2和Qt5.1.1 因为一些乱七八糟的原因,我需要用mingw静态编译Qt4.8.2和Qt5.1.1。 经历了一天的折腾之后,自觉编译一下Qt还是件颇为麻烦的事情,故将过程略作总结,以备不时之需。 首先,在编译之前,我需要下载mingw、qt-everywhere-opensource-src-4.8.2和qt-everywhere-opensource-src-5.1.1。 然后,准备开始编译了,当然 阅读详情

相关推荐

zlib-1.2.13编译

zlib1.2.13编译,windwos平台vs2008mt和md方式编译zlib-1.2.13动态库、静态库。

binary0010的博客 851

Theano2.1.7-基础知识之设置的配置和编译模式

来自:http://deeplearning.net/software/theano/tutorial/modes.html Configuration Settings and Compiling Modes 一、配置     该 config 模块包含了好几个属性用来修改theano的行为。许多属性会在导入theano模块的时候被检查的,其中一些属性是被假定成只读形式的。约定

shouhuxianjian的专栏 1470

Cursor Pro版保姆级开通教程:绕过7天试用,支付宝一步搞定(附地区报错解决方案)

本文详细介绍了Cursor Pro版的订阅流程,包括支付宝支付步骤和解决区域报错的实用方案。针对开发者常见的网络问题和云服务器配置需求,提供了从本地环境调整到云端部署的完整指南,帮助用户高效解锁Pro版的代码补全、私有代码库等核心功能。

weixin_28710999的博客 2086

使用Opencv 2.1/2.2 编译64位程序时,编译器内部错误 error c1001

MSDN bug report Internal compiler error C1001 when compiling OpenCV 2.1/2.2 with C++/CLI 64 bit http://connect.microsoft.com/VisualStudio/feedback/details/629931 解决方案: (1). 不使用 /clr 选项,或者 #pra

Xunixing的专栏 2911

STM32F407硬件IIC驱动OLED避坑实录:从‘不显示’到‘稳定刷屏’的完整调试过程

本文详细记录了使用STM32F407硬件IIC驱动OLED屏幕的完整调试过程,从初始的‘不显示’问题到最终实现‘稳定刷屏’。文章涵盖了硬件接线、I2C外设配置、常见问题排查及性能优化技巧,特别针对STM32标准库开发中的难点提供了实用解决方案,是嵌入式开发者驱动OLED屏幕的实用指南。

weixin_30315723的博客 303

从CTFShow靶场实战,聊聊Node.js原型链污染漏洞的几种利用姿势(附详细复现步骤)

本文深入剖析Node.js原型链污染漏洞的原理与实战利用,通过复现CTFShow靶场题目(web338-web341),详细演示五种高级利用技巧,包括基础污染、多级污染、模板引擎RCE等,并提供防御方案与最佳实践,帮助开发者提升Web应用安全性。

weixin_30791095的博客 445

HNU-编译原理-实验2-Bison

本次实验需要在 Lab1 已完成的 `flex` 词法分析器的基础上,进一步使用 `bison` 完成语法分析器。 1.了解 bison 基础知识和理解 Cminus-f 语法(重在了解如何将文法产生式转换为 bison 语句) 2.阅读 /src/common/SyntaxTree.c,对应头文件 /include/SyntaxTree.h(重在理解分析树如何生成) 3.了解 bison 与 flex 之间是如何协同工作,看懂pass_node函数并改写 Lab1 代码(提示:了解 yylval 是如何

wolf的博客 2513

大型我的世界RPG服务器开服全攻略:从环境配置到插件部署

搭建一个能支撑百人稳定在线的我的世界服务器,远不止选择服务端和安装插件那么简单。服务器架设涉及硬件选型、Java环境、端口放行、启动脚本与systemd守护等基础环节,而大型RPG玩法还依赖MythicMobs、Quests、LuckPerms等插件协同工作。理解这些技术组件的原理与配置逻辑,是确保长线运营的关键。对于希望打造原创剧情、职业副本和自定义Boss的团队而言,合理规划MySQL数据库、RCON批量管理及性能调优,能显著降低后期维护成本。本文围绕RPG服务器核心能力,从环境准备到插件部署,再到常见

weixin_27230891的博客 369

JAVA基础知识回顾

JAVA基础知识回顾 晚间窗外吹来的风令人清醒,喝一口杯中的温水,适合回顾下JAVA基础知识,温故而知新。 JAVA的版本 JAVA1.5(JDK5.0)是一重大版本,新增了自动装箱拆箱、枚举、静态导入、可变参数、内醒等功能。 JAVA1.8(JDK8.0)目前较为常用,目前国内大部分公司使用的都是JDK8.0。 JAVA平台版本 J2SE:标准版,为开发普通桌面和商务应用程序提供的解决方案是其他两者的基础,可完成一些桌面程序的开发。 J2ME:小型版,为开发电子消费产品和嵌入式设备提供的解决方案。 J2E

qq_43558335的博客 879

手把手调试Android 10 DHCP服务:从dumpsys network_stack到DhcpServer.java的实战技巧

本文详细介绍了在Android 10中调试DHCP服务的实战技巧,从使用dumpsys network_stack分析服务状态到深入DhcpServer.java源码追踪问题。文章提供了完整的工具链配置、关键调试命令和常见问题解决方案,帮助开发者高效解决DHCP服务未启动、IP分配失败等典型问题,特别适合需要深入理解Android网络架构的开发者参考。

uu89012的博客 741

倒立摆的PLC控制(模型分析+ SCL源代码)

首先简单介绍下倒立摆模型,下面这幅图是MATLAB网站上的倒立摆模型,下面我们利用牛顿第二运动定律建立摆杆的运动方程。

RXXW_Dor的博客 3327

Windows下编译Mitsuba 1&2

目录简介Mitsuba 2准备工作编译过程获取源码编译设置路径使用参考文档Mitsuba 1准备工作编译过程安装依赖获取源码编译编译错误1编译错误2编译错误3设置路径参考文档 简介 Mitsuba是一款面向研究的渲染器,因其对材质的模拟非常细致,故而在研究领域应用的非常多。Mitsuba的开发团队也比较争气,已经开发到第二代了。最近由于工作上的需要,在Windows下陆续编译了2代和1代的Mitsuba源码,踩了一些坑,在这里记录一下。 注:Mitsuba相关的代码和数据都可以在他们的github账户下找到

子宽的专栏 3372

AI预测彩票,使用chatgpt和lstm神经网络(文末附源码)

AI预测彩票,使用chatgpt和lstm神经网络(文末有彩蛋)

淘淘小窝 1万+

JVM C1,C2编译器以及分层编译

JVM会在解释执行的时候收集程序运行的各种信息,然后编译器会根据这些信息进行一些基于预测的激进优化,比如分支预测,根据程序不同分支的运行概率,选择性地编译一些概率较大的分支。当下次执行时,再遇到这段代码,就会从codeCache中读取机器码,直接执行,以此来提升程序运行的性能。C2编译器是为长期运行的服务器端应用程序做性能调优的编译器,适用于执行时间较长或者对峰值性能有要求的程序,也称为Server Compiler,例如,服务器上长期运行的Java应用对稳定运行就有一定的要求。

adolph09的博客 2747

[nlp] 自然语言理解基准 ATIS Snips

ATIS 4k 21 Intents(not include UNK) 120 SlotsSNIPS 13k 7 Intents(not include UNK) 72 SlotsATIS Benchmark (Intent Detection) | Papers With CodeSNIPS Benchmark (Intent Detection) | Papers With Code

心宝的博客 746

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JVM 的 C1/C2 编译器

JVM 的 C1/C2 编译器负责将热点代码编译为高效机器码,提升 Java 程序性能。编译阈值 CompileThreshold 控制方法被编译的时机,影响启动速度与运行效率。分层编译机制结合了 C1 快速启动和 C2 高性能的优势,是现代 JVM 的默认模式。通过合理调节相关参数,可以根据应用场景优化 JVM 性能。如需针对实际项目给出具体调优方案,或更深入了解 JVM 内部机制,欢迎继续提问!

liu_rockefeller的博客 975

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

编译Android2.1 for G1

<br />1.说明<br />1)下载编译最基本的android源码,无法在真机上使用(不能生成boot.img),只能在模拟器上使用。这是因为没有编译相关机型的内核和硬件驱动。以下介绍的是用android源码编译出对应HTC G1的版本,和烧写的过程。编译生成的版本除相机不能用之外,其它绝大部分功能都能正常使用,在G1上运行2.1版的速度也不错。<br />2)本文主要参考日文文档G1/G2烧机指南,感谢原文作者,原文地址:<br />http://code.google.com/p/android-d

Fly的专栏 1572

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

2.2 Windows MSYS2编译FFmpeg 4.4.1

本文介绍了在MSYS2环境下安装FFmpeg编译工具和依赖库的方法。第一部分列出基础编译工具链,包括gcc、nasm/yasm汇编器、pkgconf等。第二部分详细分类整理了视频/音频编码库(如x264、x265、fdk-aac等)和其他功能库(如字幕、字体、流媒体支持),并对应给出pacman安装命令和FFmpeg配置选项。特别说明cmake需系统安装而非pacman版本。该指南为在Windows平台通过MSYS2编译功能完整的FFmpeg提供了完整的依赖解决方案。

卖猪肉的痴汉 1006

HotSpot的 C1 和 C2 编译器

一 HotSpot VM 设置程序执行方法 缺省情况下 HotSpot VM 是采用解释器与即时编译器并存的架构,当然开发人员可以根据具体的应用场景,通过命令显式地为 Java 虚拟机指定在运行时到底是完全采用解释器执行,还是完全采用即时编译器执行。 -Xint:完全采用解释器模式执行程序 -Xcomp:完全采用即时编译器模式执行程序。如果即时编译出现问题,解释器会介入执行。 -Xmixed:采用解释器+即时编译器的混合模式共同执行程序。 二 HotSpot VM中 J.

实践求真知 1875

编译SDL1.2

SDL1.2和SDL2.0 sdl是什么?这里就不解释了,之前的文中也说过。今天主要说说最近sdl给我填的堵。 这个说来话也长,由于工作需要,最近在用OpenCV,记得几年前用就用过OpenCV,或者说写过一些OpenCV的代码吧。OpenCV里面有使用OpenCL加速。早期由于OpenCV使用OpenCL主要是在PC端,所以在local size啊之类的东西都是按照pc来设置,而要把OpenC...

厚德出品,必是精品 879

6-3-2JITC1编译器C2和Graal

​定位与特点​C1是HotSpot JVM的轻量级即时编译器(JIT),启动速度快,适合客户端程序或对启动性能敏感的场景。其优化策略偏向基础,牺牲部分峰值性能以降低编译耗时。​编译流程与中间表示​​HIR(高级中间表示)​:将字节码转换为SSA形式的控制流图,支持平台无关优化,如全局值编号(GVN)、空值检查消除、冗余代码删除等。​LIR(低级中间表示)​:贴近目标架构,用于寄存器分配(线性扫描算法)和机器代码生成。

weixin_45530192的博客 1085

编译opencv2.1静态库

介绍了vc2008下opencv静态库的编译。

4117

交叉编译libxml2-2.9.1

描述 交叉编译,按照个人的理解,是为了让原本在PC能够正常运行的APP,换了一个执行环境以后依然能够正常执行。一个APP执行起来,势必会依赖到某些动态库,因此,这些库文件也需要进行交叉编译,并放到相应的路径下,才能给APP使用。 前提 首先,对一个库进行交叉编译,肯定需要一份相应的源码,要清楚使用的是什么编译工具,编译该库时应注意哪些开关项,编译该库是否有依赖项未解决…… 交叉编译libxml2-...

ZefinNg的博客 2057

VS2017编译flann-1.9.2

添加lz4头文件路径 :CMAKE_INCLUDE_PATH D:/ThirdParty/lz4-1.9.4/include添加PKG_CONFIG_PATH环境变量:set(ENV{PKG_CONFIG_PATH} D:\ThirdParty\lz4-1.9.4\lib\pkgconfig)取消勾选:BUILD_PYTHON_BINDINGS、BUILD_MATLAB_BINDINGS、BUILD_TESTS。

u014173215的博客 1222

【jvm】C1编译器和C2编译器的区别

1.JVM(Java虚拟机)中的C1编译器和C2编译器是两种不同的即时编译器(JIT Compiler),它们各自具有独特的特点和适用场景。1.C1编译器:由于编译速度快且生成的代码相对较小,因此启动性能较好。2.C2编译器:虽然编译速度慢且生成的代码较大,但长期运行时的性能优越。2.在分层编译中,整个优化过程被划分为多个层次,每个层次对应不同的编译策略和优化级别。3.C1编译器通常负责前几个层次的编译任务,进行简单的优化。1.编译速度慢,但生成的代码质量高,执行效率高。3.优化程度较高,注重全局优化。

王佑辉的博客 1021

本地编译Hadoop2.9.1源码总结

目录   一、文档编写的目的 二、编译要求 三、软件安装 3.1 安装JDK 3.2 安装各种库 3.3 安装maven 3.4 安装protocolBuffer 3.5 安装findbugs 四、开始编译 五、编译中可能遇到的问题 一、文档编写的目的 当在Windows平台安装hadoop时,或者添加Hadoop一些额外功能时,需要对Hadoop源码进行编译,本文以Ha...

强者的博客 1608
上一篇: Git 切换到旧提交,同时保证当前修改不丢失
下一篇: 1.3 编译程序:单个C文件和多个C文件
卖猪肉的痴汉
博客等级 码龄10年 166粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值