首页
学习
活动
专区
工具
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.6K10

静态库和动态库:从概念、选择举例到实际使用中的注意事项

当你编译一个使用静态库的程序时,编译器会将库中你程序所需的所有函数和数据复制到最终的可执行文件中。这意味着,一旦程序被编译,它就包含了所有它需要的库代码,不再需要任何外部的库文件。...在C++中,静态库通常有.lib或.a的文件扩展名(在Windows和Unix/Linux系统上)。创建静态库在C++中,创建静态库通常涉及以下步骤:编写你的代码(函数和类)。...例如,你可以使用以下命令创建一个静态库:g++ -c mycode.cppar rcs libmycode.a mycode.o使用静态库在C++中,使用静态库通常涉及以下步骤:在你的代码中包含库的头文件...在C++中,动态库通常有.dll(在Windows系统上)或.so(在Unix/Linux系统上)的文件扩展名。创建动态库在C++中,创建动态库通常涉及以下步骤:编写你的代码(函数和类)。...例如,你可以使用以下命令创建一个动态库:g++ -shared -o libmycode.so mycode.cpp使用动态库在C++中,使用动态库通常涉及以下步骤:在你的代码中包含库的头文件。

35610
  • 深入剖析运行时库配置错误:从静态库到动态库的常见陷阱

    在实际项目开发中,开发者经常需要在静态库与动态库之间做出选择。...然而,由于编译器运行时库(CRT)的配置差异,从静态库项目切换到动态库项目时,往往会遇到诸如“RuntimeLibrary 不匹配”的错误。...本文以一个具体案例为例,详细解析为何将项目配置为动态库(DLL)后会出现运行时库不匹配的错误,并提供切实可行的解决方案。2....Visual Studio 中的两种主要配置方式分别为:静态链接(/MT):将 CRT 代码直接嵌入到目标文件中,生成的可执行文件或库无需依赖外部的 CRT 动态链接库。...本文通过一个具体案例详细分析了从静态库项目切换到动态库项目时,由于 /MT 与 /MD 混用引发的链接错误,并给出了以下建议:统一配置:确保所有模块(包括第三方依赖库)均使用相同的运行时库配置。

    11510

    【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.2K30

    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

    99520

    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.9K20

    qmake:高级用法

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

    1.9K10

    qmake手册(Qt5.9.3)

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

    5.8K20

    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.4K20

    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时打印消息 >

    36420

    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可以大写。

    64900

    Qt:windows下Qt安装教程

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

    6.1K20

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

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

    11110

    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 #生成静态库需要的源文件。

    8.1K31

    cmake使用

    他能够输出各种各样的makefile或者project文件,能测编译器所支持的C++特性,类似UNIX下的automake。只是 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

    56100

    Qt高级——QMake快速入门

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

    1.5K21
    领券