工具链中库和头文件的搜索路径

制作.so文件

我们的目标是制作共享库,即.so文件。

 

首先,编译stack.c:

$gcc -c -fPIC -o mystack.o mystack.c

-c表示只编译(compile),而不连接。-o选项用于说明输出(output)文件名。gcc将生成一个目标(object)文件mystack.o

注意-fPIC选项。PIC指Position Independent Code。共享库要求有此选项,以便实现动态连接(dynamic linking)。

 

生成共享库:

$gcc -shared -o libmystack.so mystack.o

库文件以lib开始。共享库文件以.so为后缀。-shared表示生成一个共享库。

 

这样,共享库就完成了。.so文件和.h文件都位于当前工作路径(.)。

 

使用共享库

我们编写一个test.c,来实际调用共享库:

复制代码
#include <stdio.h>
#include "mystack.h"

/*
* call functions in mystack library
*/ void main(void) { ElementTP a; int i; STACK sk; sk = init_stack(); push(sk, 1); push(sk, 2); push(sk, 8); printf("Stack is null? %d\n", is_null(sk)); for (i=0; i<3; i++) { a = pop(sk); printf("pop: %d\n", a); } printf("Stack is null? %d\n", is_null(sk)); delete_stack(sk); }
复制代码

注意,我们在程序的一开始include了mystack.h。

 

编译上述程序。编译器需要知道.h文件位置。

  • 对于#include "...",编译器会在当前路径搜索.h文件。你也可以使用-I选项提供额外的搜索路径,比如-I/home/vamei/test。
  • 对于#include <...>,编译器会在默认include搜索路径中寻找。

编译器还需要知道我们用了哪个库文件,在gcc中:

  • 使用-l选项说明库文件的名字。这里,我们将使用-lmystack (即libmystack库文件)。
  • 使用-L选项说明库文件所在的路径。这里,我们使用-L. (即.路径)。

如果没有提供-L选项,gcc将在默认库文件搜索路径中寻找。

 

你可以使用下面的命令,来获知自己电脑上的include默认搜索路径:

$`gcc -print-prog-name=cc1` -v   

获知库默认搜索路径:

$gcc -print-search-dirs

 

我们所需的.h和.so文件都在当前路径,因此,使用如下命令编译:

$gcc -o test test.c -lmystack -L.

将生成test可执行文件。

 

使用

$./test

执行程序

 

运行程序

尽管我们成功编译了test可执行文件,但很有可能不能执行。一个可能是权限问题。我们需要有执行该文件的权限,见Linux文件管理背景知识

另一个情况是:

./test: error while loading shared libraries: libmystack.so: cannot open shared object file: No such file or directory

 

这是因为操作系统无法找到库。libmystack.so位于当前路径,位于库文件的默认路径之外。尽管我们在编译时(compile time)提供了.so文件的位置,但这个信息并没有写入test可执行文件(runtime)。可以使用下面命令测试:

$ldd test

ldd用于显示可执行文件所依赖的库。显示:

    linux-vdso.so.1 =>  (0x00007fff31dff000)
    libmystack.so => not found
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fca30de7000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fca311cb000)

这说明test可执行文件无法找到它所需的libmystack.so库文件。

 

为了解决上面的问题,我们可以将.so文件放入默认搜索路径中。但有时,特别是多用户环境下,我们不享有在默认搜索路径写入的权限。

一个解决方案是设置LD_LIBRARY_PATH环境变量。比如:

$export LD_LIBRARY_PATH=.

这样,可执行文件执行时,操作系统将在先在LD_LIBRARY_PATH下搜索库文件,再到默认路径中搜索。环境变量的坏处是,它会影响所有的可执行程序。如果我们在编译其他程序时,如果我们不小心,很可能导致其他可执行文件无法运行。因此,LD_LIBRARY_PATH环境变量多用于测试。

另一个解决方案,即提供-rpath选项,将搜索路径信息写入test文件(rpath代表runtime path)。这样就不需要设置环境变量。这样做的坏处是,如果库文件移动位置,我们需要重新编译test。使用如下命令编译test.c:

$gcc -g -o test test.c -lmystack -L. -Wl,-rpath=.

-Wl表示,-rpath选项是传递给连接器(linker)。

### 回答1: 要将MSP432驱动库添加到接器的库路径中,需要执行以下步骤: 1. 打开Code Composer Studio(CCS)IDE,选择你的项目。 2. 在项目资源管理器中右键单击项目,然后选择“属性”。 3. 在弹出的“属性”对话框中,选择“Build”选项卡。 4. 在“Build”选项卡中,选择“MSP432 Linker”选项。 5. 在“MSP432 Linker”选项卡中,选择“File Search Path”选项。 6. 在“File Search Path”选项卡中,点击“Add”按钮,添加MSP432驱动库的路径。 7. 点击“OK”按钮保存更改。 现在,MSP432驱动库就已经添加到接器的库路径中了。在编译和接代码时,接器将自动搜索接MSP432驱动库。 ### 回答2: 将MSP432驱动库添加到接器的库路径中,可以通过以下步骤进行: 首先,打开MSP432工程的项目属性设置。可以在IDE的菜单栏中找到“项目”或者“设置”等选项。 接着,在项目属性设置中找到“构建设置”或者“编译设置”等选项。这个选项通常用来配置编译器和接器的相关设置。 然后,找到接器设置或者库文件设置相关的选项。一般来说,该选项位于项目属性设置的“工具设置”或者“接器设置”中。 在接器设置中,一般有一个“库路径”或者“路径”的选项,用于标识接器在编译时搜索库文件的路径。这个路径应该包含MSP432驱动库的位置。 接下来,点击“库路径”或者“路径”选项,选择“添加”或者“编辑”按钮,以添加或者修改接器的库路径。 在弹出的对话框中,浏览电脑文件系统,找到MSP432驱动库所在的文件夹。选择该文件夹并确认,将MSP432驱动库的路径添加到接器的库路径中。 最后,点击“应用”或者“确定”按钮,保存设置并退出项目属性设置。 通过上述步骤,我们可以将MSP432驱动库成功添加到接器的库路径中。这样,在编译和接过程中,接器就能够正确地找到并使用MSP432驱动库的功能了。 ### 回答3: 要将MSP432驱动库添加到接器的库路径中,需要按照以下步骤进行: 1. 打开MSP432驱动库的文件夹,其中包含了库文件和头文件。这些文件通常以".c"和".h"为后缀。 2. 将库文件和头文件拷贝到您的项目文件夹中的合适位置,例如一个单独的文件夹。 3. 打开Code Composer Studio(CCS)或其他编辑器,将您的项目打开。 4. 在工程目录中找到Linker文件夹,并打开其中的接器脚本文件。 5. 在接器脚本文件中,找到库路径设置部分。通常这一部分被注释掉了,以";"开头。 6. 取消注释该部分,并在其中添加您的库文件路径。例如,如果您将库文件和头文件放在了名为"driverlib"的文件夹下,您可以添加以下代码: LIBRARY_PATH = ../driverlib 7. 确保接器脚本文件保存,然后重新编译和接您的项目。 8. 当接器进行库文件的接时,它会在您指定的路径搜索相关的库文件。 通过以上步骤,您就可以将MSP432驱动库添加到接器的库路径中,以便在项目中使用该驱动库的功能。注意,具体的步骤可能会因您使用的开发环境和工具而有所不同,但整体流程是类似的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值