首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

创建一个项目,从Makefile到UNIX中的静态/动态库

创建一个项目,从Makefile到UNIX中的静态/动态库。

在UNIX系统中,创建一个项目通常需要编写Makefile文件来自动化构建过程。Makefile文件是一个包含规则的文本文件,用于指定如何编译和链接源代码以生成可执行文件和库。

静态库和动态库是两种不同的库类型,它们在编译和链接时有不同的行为。静态库是在编译时将所有的代码和数据直接链接到可执行文件中,而动态库则在运行时动态加载到内存中。

在Makefile文件中,可以使用特定的规则来创建静态库和动态库。例如,以下是一个简单的Makefile文件示例,用于创建静态库和动态库:

代码语言:makefile
复制
CC = gcc
CFLAGS = -Wall -O2
AR = ar
RANLIB = ranlib

LIB_SRCS = libfoo.c libbar.c
LIB_OBJS = $(LIB_SRCS:.c=.o)
LIB_NAME = mylib

STATIC_LIB = lib$(LIB_NAME).a
SHARED_LIB = lib$(LIB_NAME).so

all: static shared

static: $(STATIC_LIB)

shared: $(SHARED_LIB)

$(STATIC_LIB): $(LIB_OBJS)
	$(AR) rcs $@ $^
	$(RANLIB) $@

$(SHARED_LIB): $(LIB_OBJS)
	$(CC) -shared -o $@ $^

clean:
	rm -f $(LIB_OBJS) $(STATIC_LIB) $(SHARED_LIB)

在这个Makefile文件中,我们定义了一些变量,例如CC、CFLAGS、AR、RANLIB等,用于指定编译器、编译选项、库工具和其他工具。然后,我们定义了一些规则,用于编译和链接源代码以生成静态库和动态库。

在静态库规则中,我们使用ar工具将所有的.o文件打包成一个.a文件,然后使用ranlib工具创建索引。在动态库规则中,我们使用gcc工具的-shared选项将所有的.o文件链接成一个.so文件。

最后,我们定义了一个clean规则,用于清除所有的中间文件和生成的库文件。

总之,创建一个项目,从Makefile到UNIX中的静态/动态库需要熟悉Makefile文件的编写和库的创建过程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux入门入土③(GCC、静态动态链接、Git、Make、Makefile)

静态动态区别静态代码在编译时就拷⻉应⽤程序,因此当有多个程序同时引⽤⼀个静态库函数时,内存中将会调⽤函数多个副本。由于是完全拷⻉,因此⼀旦连接成功,静态就不再需要了,代码体积⼤。...参数c:创建一个,不管是否存在,都将创建。参数s:创建目标文件索引,这在创建较大时能加快时间。参数r:在库插入模块 (替换)。...app文件:图片但是我们如果移动app这个可执行文件,会发现报错,动态无法加载:图片解决动态无法加载问题库工作原理静态如何被加载在程序编译最后一个阶段也就是链接阶段,提供静态会被打包可执行程序...==同样对应动态文件也没有被打包可执行程序,只是在可执行程序记录了名字。...图片解决方案③:拷贝动态文件系统目录 /lib/ 或者 /usr/lib (或者将软链接文件放进去)图片静态动态优缺点静态:优点:静态被打包应用程序中加载速度快发布程序无需提供静态

1.5K10

【C 语言】动态封装与设计 ( 动态调用环境搭建 | 创建应用 | 拷贝动态相关文件源码路径 | 导入头文件 | 配置动态引用 | 调用动态函数 )

文章目录 一、在 Visual Studio 2019 创建 " 控制台应用 " 程序 二、拷贝 xxx.lib、xxx.dll、xxx.h 源码路径 三、导入 xxx.h 头文件 四、配置动态引用...五、调用动态函数 一、在 Visual Studio 2019 创建 " 控制台应用 " 程序 ---- 欢迎界面 , 选择 " 创建项目 " , 选择创建 " 控制台应用 " 项目类型..., 配置 项目名称 与 位置 , 项目创建完成后 , 初始程序是 C++ 程序 , 这里修改为 C 语言程序 ; 二、拷贝 xxx.lib、xxx.dll、xxx.h 源码路径 ---- 将...动态 描述文件 xxx.lib , 动态文件 xxx.dll , 动态头文件 xxx.h , 拷贝 项目的源码路径 , 注意就是主函数源码所在目录 ; 三、导入 xxx.h 头文件 --...选择 " 配置属性 -> 链接器 -> 输入 -> 附加依赖项 " " 编辑 " 选项 , 将 xxx.lib 选项 , 拷贝到此处 ; 五、调用动态函数 导入头文件 , 即可调用动态函数

2.1K30
  • qmake使用

    qmake特点 为不同平台开发项目创建makefile。 可以供给任何一个软件项目使用,而不用管它是不是用Qt写,尽管它包含了为支持Qt开发所拥有的额外特征。...qmake基于一个项目文件这样信息来生成makefile项目文件可以由开发者生成。 不用修改项目文件,qmake也可以为Microsoft Visual Studio生成项目。.../Bin/$$CurConfig/ #目标文件最终路径,pro文件开始相对路径 OBJECTS_DIR = obj/$$CurConfig #.o文件目录 SOURCES += \.../ThirdPartyLib/openrave-0.9/lib/ #如果要添加链接,只需要加载头文件路径和动态路径即可 # INCLUDEPATH += /usr/local/cuda/include...可以使用qmake -h查看具体说明 qmake生成makefile 调试经验 在linux平台下可以用ldd命令查看so所依赖其他so,readelf -d libxxx.so | grep

    98720

    qmake:变量手册

    默认情况下,androiddeployqt 工具将应用程序模板 Qt for Android 安装路径复制项目的构建目录,然后它复制此变量指定路径内容,覆盖任何现有文件。...create_libtool:为当前构建创建一个 libtool .la 文件。 create_pc:为当前构建创建一个 pkg-config .pc 文件。...static、staticlib:目标是一个静态(仅限 lib)。正确编译器标志将自动添加到项目中。 plugin:目标是一个插件(仅限 lib)。 这也启用了 dll。...允许值为: app:创建用于构建应用程序 Makefile(默认)。 lib:创建用于构建 Makefile。 subdirs:创建用于在子目录构建目标的 Makefile。...子目录是使用 SUBDIRS 变量指定。 aux:为不构建任何内容项目创建一个 Makefile。 如果不需要调用编译器来创建目标,请使用此选项。例如,项目是用解释性语言编写

    3.8K20

    qmake:高级用法

    二、安装文件 在 Unix 上经常使用构建工具来安装应用程序和,例如通过调用 make install。qmake 有一个安装集概念。...depends:自定义构建目标所依赖现有构建目标。 recurse:指定在 Makefile 创建规则以调用子目标特定 Makefile 时应使用哪些子目标。...例如,在静态链接时,不会链接其他,因此不会创建对这些依赖项。如果明确启用跟踪,qmake 会在适当情况下尝试跟踪依赖项。 第一步是在库本身启用依赖项跟踪。...启用此选项后,qmake 将创建一个以 .prl 结尾文件,该文件将保存有关一些元信息。这个元文件就像一个普通项目文件,但只包含内部变量声明。...第二步是在使用静态应用程序启用此元信息读取: CONFIG += link_prl 启用此功能后,qmake 将处理应用程序链接所有并找到它们元信息。

    1.8K10

    qmake手册(Qt5.9.3)

    qmake根据项目文件信息生成一个Makefile项目文件是由开发人员创建,通常很简单,但是可以为复杂项目创建更复杂项目文件。...例如,当静态链接一个时,没有其他链接到,因此不会创建这些依赖关系。然而,后来链接到这个应用程序需要知道在哪里可以找到静态所需符号。...Makefile Xcode Unix GCC 3.4及以上 将预编译头添加到您项目 预编译头文件必须包含在整个项目中稳定和静态代码。...关闭这个选项会根据目录对源/头组文件进行分组他们居住。这是默认打开。 embed_manifest_dll 将清单文件嵌入作为项目的一部分创建DLL。...有关可用插件列表,请参阅静态插件,以及覆盖自动链接方法。 当链接到Qt共享/动态构建或链接时,此变量当前不起作用。它可能用于稍后部署动态插件。 QT_VERSION 包含当前版本Qt。

    5.7K20

    Android NDK开发扫盲及最新CMake编译使用

    2.1 Hello world 我们通过一个Hello World项目来理解 CMake 首先创建一个包含原生代码项目。...(其实官方文档中大部分都是的,并没有使用 CMake) 幸运是, Github上官方示例 里面有个项目 hello-libs 实现了如何创建静态/动态,并引用它。...[hello-libs] 我们先看下Github上README介绍: app - $project/distribution/ 中使用一个静态一个动态 gen-libs - 生成一个动态一个静态并复制...命令把头文件也复制到了 distribution_DIR 。 以上就是一个静态/动态编译过程。...可以看下基本上分成了4个步骤引入: 分别创建静态/动态,直接引用已经有的 .a 文件 或者 .so 文件 创建自己应用 hello-libs 加入之前暴露头文件 链接上静态/动态 还是很好理解

    2.4K30

    深入浅出CMake(一):基础篇

    一个最简单 CMake 例子 要构建一个 CMake 编译系统,首先需要在代码根目录创建一个 CMakeLists.txt 文件,这个文件是用来描述构建过程,可以看做是一个高级版 Makefile...这正式 hello.cpp 输出。 这是最简单 cmake 编译例子,但实际工作是不会有这么简单,实际工作中会涉及很多源文件,还有很多动态静态。...,默认是 .a 文件,也就是静态,如何生成动态接下来部分会讲。...以上例子就基本覆盖了我们日常开发模式。 指定头文件路径 指定动态或者是静态路径,然后链接。...可执行文件 add_executable()指定了可执行文件,它是 unix 上 a.out 之类文件和 windows 平台 .exe 文件 动态静态都使用 add_library()命令生成

    1.3K30

    Hello Qt——QMake用户指南

    例如: qmake -makefile -unix -o Makefile “CONFIG+=test” test.pro 上述代码会使用unix路径名test.pro文件生成一个Makefile。...LIBS += -framework #TheFramework C、创建框架 任何给定项目都可以被配置,以便生成文件放置在准备部署框架。...E、创建和移动XCode项目 MAC OS X平台开发者可以利用qmake对XCode工程文件支持,通过运行qmake已有的qmake工程文件生成一个XCode工程。...例如,当静态链接一个时,没有链接到其他,因此不会创建与这些依赖关系。但是,后续链接到该应用程序需要知道在哪里可以找到静态所需符号。...在安装此时,通过将其指定为INSTALLS声明目标,qmake将自动将.prl文件拷贝安装路径。 B、在使用静态应用程序读取该元信息。

    6.1K20

    cmake 简介2021-10-03

    (${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录 link_directories:动态链接静态链接搜索路径,相当于gcc-L参数...2) 怎样指定项目编译目标 >> project命令指定 3) 怎样添加动态静态 >> target_link_libraries命令添加即可 4) 怎样在执行CMAKE时打印消息 >...CMake 是一个比 automake 更加容易使用工具,能够使程序员复杂编译连接过程解脱出来。...(${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录 link_directories:动态链接静态链接搜索路径,相当于gcc-L参数...2) 怎样指定项目编译目标 >> project命令指定 3) 怎样添加动态静态 >> target_link_libraries命令添加即可 4) 怎样在执行CMAKE时打印消息 >

    35320

    Linux基本工具——gccg++与makeMakefile

    Linux编译器,项目构成工具 gcc/g++ 程序翻译过程 选项含义 动态链接静态链接 如何识别静态链接和动态链接 Linux项目自动化构建工具——make/Makefile make/Makefile...动态链接 一个程序多次使用了同一个动态,这时候不会重复这个动态,而是只有一个,这也叫做共享。 所以下载动态链接c程序就不用再去下载c标准。...静态链接 静态链接拷贝时候并不是从动态拷贝,是静态拷贝。 一般系统是自带动态静态不一定自带。 注意:动态链接只能去动态找,静态链接只能去静态拷贝。...windows下动态静态后缀 动态:.dll 静态:.lib Linux项目自动化构建工具——make/Makefile make/Makefile是什么 make是一个命令,makefile...make/Makefile使用 首先需要先创建makefile这个文件,必须叫这个名字,第一个M可以大写。

    61800

    Linux下automake工具使用(自动构建Makefile文件)

    无论是在Linux还是在Unix环境,make都是一个非常重要编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make install。...) 7.1 创建待编译源码(模拟真实项目环境) 在第一章里简单介绍了使用automake自动产生makefile几个关键步骤,所有文件都在同一个目录下。...但在比较大项目中,很少将所有文件放在一个目录下。下面将针对这种情况做个简单介绍。 多级目录结构软件,一般是单个程序、文件或模块放在各自目录。...在安装目录下文件结果 九、auotomake多级目录生成Makefile(发布动态+静态) 1. 目录结构如下 在main.里调用了led.c和key.c里函数。...lib_LTLIBRARIES=libkey.la #生成动态文件 libkey_la_SOURCES =key.c key.h #生成静态需要源文件。

    7.5K31

    Qt:windows下Qt安装教程

    静态动态等,这些类文件使用 MinGW 工具集编译而成。...ld GNU 链接器,将目标文件和文件链接起来,创建可执行程序和动态链接。 ar 生成静态 .a ,可以编辑和管理静态链接。...make 生成器,可以根据 makefile 文件自动编译链接生成可执行程序或文件。 gdb 调试器,用于调试可执行程序。 ldd 查看可执行文件依赖共享(扩展名 .so,也叫动态链接)。...Windows 里面动态扩展名为 .dll,MinGW 可以通过 dlltool 来生成用于创建和使用动态链接需要文件,如 .def 和 .lib。...rcc Resource Compiler,资源文件编译器,负责在项目构建过程编译 .qrc 资源文件,将资源嵌入最终 Qt 程序里。

    5.8K20

    【Linux】《how linux work》第十五章 开发工具

    C编译器本身对于您系统并不了解,无法单独创建一个有用程序。 您需要使用来构建完整程序。C是一组常见预编译函数,您可以将其构建程序。...以 .a 结尾文件(例如 libgobject.a)被称为静态。 当你将程序与静态进行链接时,链接器会将文件机器码复制可执行文件。...共享常见问题之一是动态链接器找不到动态链接器通常应该首先查找共享位置是可执行文件预配置运行时搜索路径(rpath),如果存在的话。您将在稍后看到如何创建此路径。...那么,make 是如何 aux.c aux.o 呢?毕竟,aux.c 并不在 Makefile 。 答案是 make 遵循其内置规则。...or makefile -n 打印出构建所需命令,但不实际运行任何命令 -f file 告诉makefile读取,而不是Makefilemakefile读取 15.2.6 标准宏和变量 make

    10510

    cmake使用

    他能够输出各种各样makefile或者project文件,能测编译器所支持C++特性,类似UNIXautomake。只是 CMake 组态档取名为 CMakeLists.txt。...Cmake 并不直接建构出最终软件,而是产生标准建构档(如 Unix Makefile 或 Windows Visual C++ projects/workspaces),然后再依一般建构方式使用...(文件名称/可执行文件名称 链接文件名称) 步骤二 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile PATH 是 CMakeLists.txt 所在目录。...add_library(common SHARED util.cpp) # 生成动态或共享 搜索所有的 cpp 文件 aux_source_directory(dir VAR) 发现一个目录下所有的源代码文件并将列表存储在一个变量...${log-lib} ) 指定链接动态静态 target_link_libraries(demo libface.a) # 链接libface.a target_link_libraries(demo

    2K30

    【Linux修炼】6.gccg++及Makefile【工具篇】

    动态链接和静态链接 Linux项目自动化构建工具-make/Makefile 1. 背景 2....静态是指编译链接时,把文件代码全部加入可执行文件,因此生成文件比较大,但在运行时也就不再需要文件了。...其后缀名一般为“.a” 动态与之相反,在编译链接时并没有把文件代码加入可执行文件,而是在程序执行时由运行时链接文件加载,这样可以节省系统开销。...对于动态静态来说,动态是系统自带,即系统安装完毕就可以使用,而静态则一般需要我们自己安装,这也说明了静态并不是直接拷贝动态内容。...(windows下动态:.dll 静态:.lib) 安装C++版本gcc(g++):sudo yum install -y gcc-g++ Linux项目自动化构建工具-make/Makefile

    54200

    libxml2剖析(2):编译

    链接选项/MT表示静态链接多线程版C运行时函数(libcmt.lib),编译器自动定义_MT宏。这样生成程序不会依赖于动态msvcrt.dll。...这是GCC/G++__attribute__属性扩展,表示导出符号可见性,这在创建.so动态时有用。...参考configure.ac对本变量处理。     在Windows系统,__declspec(dllimport)用于声明一个导入函数,是说这个函数是别的DLL(或EXE)导入,我要用。...把libiconv-1.14\windows\libiconv.rc拷贝项目目录。     在libiconv项目创建子目录include,用来放各个头文件。     ...第二步:设置项目属性     把项目根目录下两个源文件、两个文件和一个资源文件导入libiconv项目视图中。设置项目属性。

    2.1K20

    Qt高级——QMake快速入门

    qmake是一个用来简化在不同平台间开发工程构建过程工具。qmake会自动生成MakeFile文件,可以用于任何软件项目中,无论是否由Qt编写。...不能直接增加这两个文件SOURCES变量,因为这会导致这两个文件直接生成MakeFile文件,需要在qmake所运行平台代码块独立处理。...现在创建一个代码块增加和Unix平台相关文件。...1、QMake创建应用程序 app模板会告诉qmake生成一个构建应用程序MakeFile。使用app模板,应用类型可以增加一个选项CONFIG变量定义。...dll:一个共享 staticlib:一个静态 plugin:一个插件,也支持dll选项 VERSION变量指定版本信息 目标文件名是平台独立

    1.4K21

    程序员C语言快速上手——工程篇(十三)

    在源码工程根目录下创建一个build文件夹,然后在命令行里cdbuild下,执行cmake ..或cmake -G "MinGW Makefiles" ..命令,此时会将所有的中间文件生成build...,用于编译一个libcalc.a静态,主工程源码在src下,且需链接静态。...子项目calc下需要一个CMakeLists.txt文件,内容如下 cmake_minimum_required (VERSION 2.8) # 创建静态calc,其生成文件名为libcalc.a...(${STATIC_LIB}) # 为main程序指定链接静态calc target_link_libraries(main ${STATIC_LIB}) 静态动态使用add_library...命令默认生成静态,如add_library (calc add.c sub.c mul.c div.c),亦可加上参数STATIC显式指定,如需生成动态,则添加参数SHARED,如add_library

    3.1K30
    领券