Linux下编译及调用库函数的方法
- 格式:docx
- 大小:15.53 KB
- 文档页数:2
静态库和动态库编译静态库和动态库是编程中常用的两种库文件形式,本文将介绍它们的编译过程和使用方法。
1. 静态库编译静态库是一种在编译时被链接到程序中的库文件,它包含了程序所依赖的所有函数和数据结构,因此程序在运行时不需要再加载库文件。
静态库的编译过程包括以下步骤:(1)创建一个或多个源文件,使用编译器将它们编译成目标文件(.o 或 .obj)。
(2)将多个目标文件打包成一个静态库文件,通常使用 ar 工具完成此操作。
例如,在 Linux 系统下,可以使用以下命令创建名为 libfoo.a 的静态库文件:$ ar rcs libfoo.a foo1.o foo2.o ...其中,rcs 参数分别表示创建、向库文件中添加目标文件和生成索引表。
(3)在编译器中使用静态库,需要将其链接到目标程序中。
在Linux 系统下,可以使用以下命令编译名为 main.c 的源文件和名为libfoo.a 的静态库文件:$ gcc -o main main.c -L. -lfoo其中,-L 参数指定库文件搜索路径,. 表示当前目录;-l 参数指定链接库文件,实际上是将其前缀 lib 和后缀 .a 去掉,即 foo。
2. 动态库编译动态库是一种在程序运行时动态加载的库文件,它只包含程序所需要的部分函数和数据结构,因此可以减小程序的尺寸和加载时间。
动态库的编译过程包括以下步骤:(1)创建一个或多个源文件,使用编译器将它们编译成目标文件。
(2)将多个目标文件打包成一个共享库文件,通常使用 ld 或链接器完成此操作。
例如,在 Linux 系统下,可以使用以下命令创建名为 libfoo.so 的动态库文件:$ gcc -shared -o libfoo.so foo1.o foo2.o ...其中,-shared 参数表示生成共享库文件。
(3)在编译器中使用动态库,需要将其链接到目标程序中。
在Linux 系统下,可以使用以下命令编译名为 main.c 的源文件和名为libfoo.so 的动态库文件:$ gcc -o main main.c -L. -lfoo其中,-L 和 -l 参数的含义同静态库。
编译libuv可以根据您的操作系统选择不同的方法。
以下是在常见操作系统上编译libuv的简要步骤:在Linux上编译libuv:安装构建工具和依赖项:在终端中运行以下命令安装构建工具:arduinoCopy codesudo apt-get install build-essential安装必要的依赖项,例如libtool和pkg-config:arduinoCopy codesudo apt-get install libtool pkg-config获取libuv源代码:您可以从libuv的GitHub仓库克隆源代码,或者从libuv的官方网站下载源代码包。
编译和安装:进入libuv源代码目录,并执行以下命令编译和安装libuv:goCopy codesh autogen.sh./configuremakesudo make install完成后,libuv将被编译并安装到系统中。
在Windows上使用Visual Studio编译libuv:安装Visual Studio:下载并安装适用于您的Windows版本的Visual Studio。
建议使用Visual Studio 2017或更高版本。
获取libuv源代码:您可以从libuv的GitHub仓库克隆源代码,或者从libuv的官方网站下载源代码包。
打开Visual Studio命令提示符:在开始菜单中搜索并打开"Visual Studio Command Prompt"。
导航到libuv源代码目录:在Visual Studio命令提示符中,使用cd命令导航到libuv源代码目录。
生成项目文件:在Visual Studio命令提示符中,执行以下命令生成项目文件:Copy codevcbuild.bat编译和安装:在Visual Studio命令提示符中,执行以下命令编译和安装libuv:Copy codenmake -f Makefile.msvc完成后,libuv将被编译并生成相关的库文件。
Linux下curses函数库1.安装 ubuntu11.10下默认没有安装curses函数库,(CentOS下默认已经安装,可以直接在usr/include下查看是否有该头⽂件来确定)使⽤ >sudo apt-get install ncurses-dev 安装curses库,这样在curses函数库的头⽂件和库⽂件就被分别安装在/usr/include/和/usr/lib/下,在编译程序时,直接使⽤命令: gcc program.c -o program -lcurses 完成编译,运⾏。
2.curses术语和概念 curses⼯作在屏幕,窗⼝和⼦窗⼝之上。
屏幕是设备全部可⽤显⽰⾯积(对终端是该窗⼝内所有可⽤字符位置),窗⼝与具体例程有关。
如基本的stdscr窗⼝等。
curses使⽤两个数据结构映射终端屏幕,stdscr和curscr。
stdscr是“标准屏幕”(逻辑屏幕),在curses函数库产⽣输出时就刷新,是默认输出窗⼝(⽤户不会看到该内容)。
curscr是“当前屏幕”(物理屏幕),在调⽤refresh函数是,函数库会将curscr刷新为stdscr的样⼦。
使⽤initscr();和endwin();两个函数对函数库进⾏初始化和重置。
#include<curses.h>WINDOW *initscr(void);int endwin(void);3.屏幕 函数基本分为如下⼏类: 输出到屏幕:1int addch(const chtype char_to_add);2int addchstr(chtype *const string_to_add); //当前位置添加字符(串)34int printw(char *format, ...); //类似与printf5int refresh(void); //刷新物理屏幕6int box(WINDOW *win_ptr, chtype vertical, chtype horizontal); //围绕窗⼝绘制⽅框7int insch(chtype char_to_insert); //插⼊⼀个字符(已有字符后移)8int insertln(void); //插⼊空⽩⾏9int delch(void);10int deleteln(void); //删除字符和空⽩⾏1112int beep(void); //终端响铃13int flash(void); //闪烁 从屏幕读取字符;1 chtype inch(void); //返回光标位置字符2int instr(char *string); //3int innstr(char *string, int numbers); //将返回内容写⼊字符数组中 清除屏幕;int erase(void); //在屏幕的每个位置写上空⽩字符int clear(void); //使⽤⼀个终端命令来清除整个屏幕,内部调⽤了clearok来执⾏清屏操作,(在下次调⽤refresh时可以重现屏幕原⽂)int clrtobot(void); //清除光标位置到屏幕结尾的内容int clrtoeol(void); //清除光标位置到该⾏⾏尾的内容 移动光标;int move(int new_y, int new_x); //移动stdcsr的光标位置 字符属性(指对字符设置加粗,反⾊显⽰等); 预定义的属性:A_BLINK, A_BOLD, A_DIM, A_REVERSE, A_STANDOUT, A_UNDERLINE.int attron(chtype attribute);int attroff(chtype attribute); //启⽤或关闭某属性int attrset(chtype attribute);int standout(void);int standend(void); //这两个表⽰更加通⽤的强调模式,通常映射为反⽩显⽰4.键盘 键盘模式:int echo();int noecho(); //⽤于开启和关闭键盘输⼊字符的回显//完成initscr后,输⼊模式为预处理模式,(1)所有处理是基于⾏的,就是说,只有按下回车,输⼊数据才被传给程序;(2)键盘特殊字符启⽤,按下合适组合键会产⽣信号int cbreak(); //设置cbreak模式,字符⼀键⼊,直接传给程序int nocbreak(); //关闭int raw(); //关闭特殊字符处理int noraw(); //同时回复默认模式和特殊字符处 键盘输⼊://与标准io库的getchar, gets, scanf类似int getch();int getstr(char *string);int getnstr(char *string, int number); //建议使⽤int scanw(char*format,...);5.窗⼝ curses函数库⽀持在⼀个物理屏幕上显⽰多个窗⼝。
归纳整理Linux下C语⾔常⽤的库函数----⽂件操作在没有IDE的时候,记住⼀些常⽤的库函数的函数名、参数、基本⽤法及注意事项是很有必要的。
参照Linux_C_HS.chm的⽬录,我⼤致将常⽤的函数分为⼀下⼏类:1. 内存及字符串控制及操作2. 字符串转换3. 字符测试4. ⽂件操作5. 时间⽇期6. 常⽤数学函数7. ⽂件内容操作8. ⽂件权限控制9. 进程操作10. 线程操作11. Socket操作12. 信号处理13. 数据结构及算法这次主要总结的是上⾯⿊⾊部分,关于⽂件操作的函数。
系统调⽤归类** 函数名⽤法备注**1. int open(const char *pathname, int flags); open and possibly create a file or device flags 必须包含O_RDONLY, O_WRONLY, or O_RDWR中的任何⼀个**2. int open(const char *pathname, int flags, mode_t mode); UP mode只是在flags中包含O_CREAT时才有效**3. int fsync(int fd); synchronize a file's in-core state with storage device 写完数据close前必须先同步,以防意外**4. off_t lseek(int fd, off_t offset, int whence); 定位⽂件位置第三个参数可以为SEEK_SET SEEK_CUR SEEK_END**5. ssize_t read(int fildes, void *buf, size_t nbyte); UP ⽂件位置会随读取的字节数移动**6. ssize_t write(int fildes, const void *buf, size_t nbyte); UP UP**7. int close(int fd); UP UP**8. void *mmap(void *addr, size_t length, int prot, int flags, 内存映射先⽤fstat得到⽂件⼤⼩,然后使⽤该函数将⽂件内容映射到内存中,然后就可以int fd, off_t offset); 直接调⽤字符串函数操作。
第1章编译与调试一个程序的编译,需要完成词法分析、语法分析、中间代码生成、代码优化、目标代码生成。
gcc是Linux下的C程序编译器。
gcc在编译一个程序时,一般需要完成预处理、编译、汇编和链接过程。
编写一个C程序:Init 3进入文本界面(init5进入图形界面)lgin:root password:123456在根目录下创建一个文件夹:mkdir a查看该文件夹下子目录:ls创建a.c文件:vi a.c按“i”键,进入到插入模式代码输入完成后,按“Esc”键,返回到普通模式,然后输入:wq,保存文件并退出用gcc编译程序:gcc –o a.o a.c这时在终端输入“ls”命令会出现一个a.o可以对这个程序添加可执行权限:chmod +x a.o运行这个程序:./a.o查看gcc参数:gcc --help查看程序的编译过程和显示已经调用的库:gcc -v a.c 如果源代码的文件扩展名不是默认的扩展名可以用:gcc -x …c‟ a.u编译C++程序时,使用的命令是g++控制预处理过程参数-E可以完成程序的预处理工作而不进行其他的编译工作。
将a.c进行预处理,然后保存a.cxx中:gcc -E -o a.cxx a.c输入vi a.xxx查看预处理以后的a.cxx文件生成汇编代码参数-S可以控制gcc在编译C程序时只生成相应的汇编程序文件,而不继续执行后面的编译,将a.c编译成一个汇编程序:gcc -S -o a.s a.c生成目标代码参数-c可以使得gcc在编译程序时只生成目录代码而不生成可执行程序,将a.c编译成目录代码:gcc -c -o a.o a.c链接成成可执行文件gcc可以把上一步骤生成的目录代码文件成成一个可执行文件:gcc a.o -o aa.out这时生成一个可执行文件aa.out。
输入下面的命令查看这个文件的信息。
file aa.outgdb调试程序使用这个工具进行程序调试时,主要使用gdb进行下面5个方面的操作。
libbsd编译libbsd是一个实现了BSD API的跨平台C库,可以在多种操作系统中使用,如Linux、macOS、FreeBSD等。
它提供了一些常见的系统编程接口,包括字符串和日期时间处理、套接字、文件系统操作等等。
这篇文章将为读者解释如何在Linux平台中编译libbsd库。
1. 在Linux平台上安装依赖项在开始编译之前,需要确保你已经在Linux系统中安装了一些必要的包。
打开终端并输入以下命令,以在Debian/Ubuntu系统中安装这些包:```sudo apt-get install autoconf automake libtool```如果你使用Red Hat/CentOS系统,请使用如下命令安装这些包:2. 下载libbsd源代码在如何编译libbsd之前,需要从官方网站下载libbsd的最新源代码。
在终端中打开一个新目录,输入以下命令从官方网站上获取libbsd的源代码:然后进入源代码所在的目录:```cd libbsd```在libbsd文件夹内执行以下命令:```autoreconf -f -i``````make```这些命令将自动创建必要的文件,并设置编译选项。
请注意,如果你需要生成静态库,则需要使用以下命令:```./configure --prefix=$(pwd)/install --disable-shared```这将在当前目录下创建“install”文件夹,并生成libbsd.a文件。
要将libbsd安装到系统中,请在libbsd目录执行以下命令:这将把编译后的库和头文件安装到/usr/local目录下。
完成库的编译和安装之后,我们需要进行一些测试以验证库是否按照预期工作。
可以使用以下命令编译和运行测试程序:或者,您可以使用make进行编译并运行测试程序:如果所有测试都成功,那么libbsd已经被安装并且可以在你的程序中进行使用了。
总结libbsd是一个非常实用的跨平台C库,它提供了许多BSD API的实现。
dotnet publish linux编译在Linux系统下使用.NETCore编写的应用程序,需要进行编译和发布,以便在Linux上运行。
本文将介绍使用dotnet publish命令将.NET Core应用程序编译为Linux可执行文件的步骤。
1.安装.NET Core SDK首先,需要在Linux系统上安装.NET Core SDK。
可以在Microsoft 官网上下载适用于Linux的.NET Core SDK,并按照官方文档进行安装。
2.创建.NET Core应用程序使用dotnet new命令创建一个新的.NET Core应用程序。
例如,可以创建一个简单的控制台应用程序:```dotnet new console -n MyLinuxApp```这将创建一个名为MyLinuxApp的控制台应用程序。
3.在Linux上编译应用程序使用dotnet publish命令将应用程序编译为Linux可执行文件。
在Linux系统上,可以使用以下命令:```dotnet publish -c Release -r linux-x64```该命令将在应用程序的bin/Release/netcoreapp3.1/linux-x64目录下生成Linux可执行文件。
4.运行应用程序最后,可以在Linux系统上运行已编译的应用程序。
使用以下命令:```./MyLinuxApp```这将运行MyLinuxApp应用程序,并在终端中输出Hello World。
总之,使用dotnet publish命令将.NET Core应用程序编译为Linux可执行文件是一件非常简单的事情,只需要按照上述步骤操作即可。
onnxruntime linux编译全文共四篇示例,供读者参考第一篇示例:ONNXRuntime是一个高性能的开源推断引擎,支持在多平台上进行推理操作。
在Linux平台上编译ONNXRuntime并使用它进行推理操作是一个比较常见的需求。
本文将介绍如何在Linux环境下编译ONNXRuntime,并提供一些常见问题的解决方案。
一、环境准备在开始编译ONNXRuntime之前,我们首先需要准备好编译环境。
Linux系统中通常会使用CMake作为构建工具,因此我们需要安装CMake和一些依赖库。
1. 安装CMake在终端中执行以下命令可以安装CMake:```shellsudo apt-get install cmake```2. 安装依赖库ONNXRuntime编译所需的依赖库有很多,具体的依赖库列表可以在官方文档中找到。
一般情况下,我们至少需要安装OpenBLAS、Protobuf、Eigen3等库。
使用以下命令可以安装OpenBLAS:其他依赖库的安装方式类似,可以根据需要进行安装。
3. 获取ONNXRuntime源码可以从ONNXRuntime的GitHub仓库中获取最新的源码:```shellgit clone https:///microsoft/onnxruntime.git```获取了源码并准备好编译环境后,我们可以开始编译ONNXRuntime了。
1. 创建build目录在源码目录外创建一个build目录,用于存放编译生成的中间文件和最终的可执行文件:2. 使用CMake进行配置在build目录下执行以下命令使用CMake进行配置:如果有特定的依赖库安装在非默认路径下,可以通过设置CMake 变量来指定路径:3. 执行make命令进行编译这里的“-j4”表示使用4个线程进行编译,可以根据机器的性能自行调整。
编译完成后,可以使用以下命令安装ONNXRuntime到系统中:三、常见问题及解决方案在编译ONNXRuntime的过程中,可能会遇到一些常见问题,下面介绍一些常见问题的解决方案。
Linux下编译及调用库函数的方法
文件说明
此demo有两个工程目录:libtest和uselibtest
libtest:lib库编译目录,生成libtest.so文件
uselibtest:应用程序,生成test可执行文件
编译库文件
1) 进入libtest目录
2) 键入:
g++ test_a.cpp test_b.cpp test_c.cpp -fPIC -shared -o libtest.so
3) 生成libtest.so文件
编译可执行文件
进入uselibtest目录
键入:
make
在debug和release目录下分别生成uselibtestd和uselibtest文件,这是debug和release版本
的可执行文件
备注:在Makefile文件中可注明需要链接的库文件
2. 查看库文件是否能够找到
进入debug目录
键入:
ldd uselibtestd
显示如下:
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00a0a000)
libtest.so => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x001f8000)
libm.so.6 => /lib/tls/libm.so.6 (0x0090c000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x002ef000)
libc.so.6 => /lib/tls/libc.so.6 (0x002f7000)
/lib/ld-linux.so.2 (0x007c2000)
说明库文件路径不正确
键入:
vi /etc/ld.so.conf
按下键盘上的Insert修改文件。
在文件最后一行加入:/mnt/hgfs/share4linux/basic_demo/uselibtest
修改后的文件为:
include ld.so.conf.d/*.conf
/usr/X11R6/lib
/mnt/hgfs/share4linux/basic_demo/uselibtest
按下Esc键退出编辑状态。
键入”:wq”保存退出
键入”ldconfig”启动刚才的设置,若显示找不到ldconfig这个命令,可使用”/sbin/ldconfig”来
达到同样的目的。
键入:
ldd uselibtestd
显示如下:
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00a0a000)
libtest.so => /mnt/hgfs/share4linux/basic_demo/uselibtest/libtest.so (0x00870000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x001f8000)
libm.so.6 => /lib/tls/libm.so.6 (0x0090c000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x002ef000)
libc.so.6 => /lib/tls/libc.so.6 (0x002f7000)
/lib/ld-linux.so.2 (0x007c2000)
此时so文件已经找到。
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00a0a000)
libtest.so => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x001f8000)
libm.so.6 => /lib/tls/libm.so.6 (0x0090c000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x002ef000)
libc.so.6 => /lib/tls/libc.so.6 (0x002f7000)
/lib/ld-linux.so.2 (0x007c2000)