在linux中使用静态库

时间:2014-03-19 19:00:25

标签: linux g++

我正在使用linux,我已经下载了我想要使用的soem1.3.0库的tarball。我编译了库,现在我想用它。问题是,我不知道该怎么做。

我有一个名为“Project”的文件夹,在这个文件夹中我有一个子文件夹,其中包含已编译的库(此子文件夹包含更多包含.a文件和头文件和源文件的文件夹),名为“Project / SOEM1.3.0”。项目文件夹还有我的主要功能源文件“Project / main.cpp”。当我尝试编译这个main.cpp时,编译器(g ++)说我试图包含的头文件是未知的。

我想我必须告诉编译器在哪里找到这个库,但是我该怎么做呢?我尝试将整个SOEM1.3.0文件夹复制到/ usr / lib,假设我的编译器能够找到它,但这不起作用。谁能告诉我该怎么做?

更新:我已经能够使用“-I path / to / headers”包含标题。但现在编译器/链接器抱怨它无法找到头文件中描述的功能。我尝试使用“-L path / to / libsoem.a -l soem -I path / to / headers”但没有结果。有什么建议?为了清楚起见,库名为libsoem.a,libosal.a和liboshw.a,以及我正在尝试的命令:

gcc -L SOEM1.3.0 / lib / linux -l soem -l osal -l oshw -I SOEM1.3.0 / soem -I SOEM1.3.0 / osal
-I SOEM1.3.0 / oshw / linux -o test main.cpp

1 个答案:

答案 0 :(得分:2)

要告诉gcc在编译期间在哪里查找头文件,请使用-I选项(lib与头文件无关,编译时不需要库,即使用-c选项时)。

你需要告诉gcc链接阶段,例如使用-o name创建可执行文件时,使用哪些库以及库所在的位置。要求某个库使用-l选项:对于libmath,你可以指定-lmath;相应地与其他lib *库。如果这些库位于非标准目录中,则使用-L选项将其告知gcc。或者你只是手动或通过make install将它们放在系统的一个普通lib目录中。

编辑:我忘了提到不明确但合乎逻辑的要求,即带有-l的链接器的库必须在依赖于库的文件,对象或源文件之后出现他们,即通常到最后。链接器只是从库中选择所需的定义,它(幸运的是)不会将所有内容混为一谈。

库之间订购也很重要,如果它们中的任何一个具有未解析的依赖关系。