如何在不使用-I选项的情况下链接静态库

How to link static library without using -I option

本文关键字:情况下 链接 静态 选项      更新时间:2024-09-30

我使用对象文件创建了C++静态库(它有许多子目录(。创建静态库后,创建了一个C文件和一个包装文件(我在C++目录下的头文件(。现在我正试图通过链接C++静态库来编译C文件,它会给头文件带来错误

错误:没有这样的文件或目录。

当我使用-I选项(-IC++头文件位置(时,编译成功并能够运行。但我想使用不包括头文件位置的静态库,即只添加静态库本身C程序应该可以成功编译。

以下是来源:

编辑:

我在libbasic文件夹下有以下文件:

testdemo.h

#ifndef TESTDEMO_H
#define TESTDEMO_H
#include<iostream>
#include<string>
using namespace std;
class testdemo
{
public:
testdemo();
void CallingTestDemo();
};
#endif // TESTDEMO_H

testdemo.cpp

#include "testdemo.h"
testdemo::testdemo()
{
}
void testdemo::CallingTestDemo()
{
`cout <<" CallingTestDemo!!!!!!n";
}

testbasic.h

#ifndef LIBBASIC_H
#define LIBBASIC_H
#ifdef __cplusplus
#include<iostream>
#include<testdemo.h>
using namespace std;
class Libbasic
{
public:
Libbasic();
void Display();
void DisplayName(char* name);
};
#endif
#ifdef __cplusplus
extern "C" {
void displayfromC();
void displayfromCName(char* name);
}

libbasic.cpp

#include "libbasic.h"
void displayfromC()
{
Libbasic llb;
llb.Display();
}
void displayfromCName(char* name)
{
Libbasic lb;
lb.DisplayName(name);
}

Libbasic::Libbasic()
{
}
void Libbasic::Display()
{
cout <<" C called C++ API n";
testdemo td;
td.CallingTestDemo();
}
#endif
#endif // LIBBASIC_H

我编译了上面的程序并创建了库libbasic.a

现在我正在libbasic文件夹外创建C API文件,以调用C++中使用的上述函数

testApi.c

#include<stdio.h>
#include <libbasic.h>
int main()
{
displayfromC();
}

现在我正在尝试使用下面的创建输出

gcc-o testdemo testApi.c-L/libbasic-lbasic

给出libbasic.h:没有这样的文件或目录错误。

其基本理念是创建一个可用于任何机器的库和API函数。如果我在C++代码中有多个文件夹和头文件,那么在创建C应用程序时需要包括所有文件夹,该应用程序也需要导出头文件。我不想向其他用户公开所有的来源。

请告诉我我犯了什么错误,以及如何做到这一点。

头文件不是包装器。

如果库中有函数,无论是静态的还是动态的,那么代码中必须有它们的声明(通常称为"原型"(。

这就是C和C++的工作方式,因此头文件是任何库不可或缺的一部分。

至于头文件的位置,这些语言提供了三个选项:

  1. <filename.h>用于标准包含标头路径。此路径取决于您的操作系统和编译器,但只要您的头文件在那里,您就不需要在编译命令中显式指定路径。

  2. 对本地源目录中的文件使用"filename.h",即*.c或*.cpp文件所在的目录。

编译器也可以自动查找,但如果头在子目录中,则需要在include语句中指定相对路径。

#include "mylib/myheader.h"
  1. 使用参数(如gcc的-I(为头文件添加额外的搜索路径

最后,类似的规则适用于它自己的库对象文件(*.a,*.lib(。

如果库不在链接器已知的标准库路径中,则除了-l参数外,还需要-L参数。

请注意,您从未指定要使用的编译器,所以我根据参数名称猜测它来自gcc家族或类似的编译器。

更改搜索路径并告诉编译器在哪里可以找到库文件的方法会因编译器类型而异,但原理是相同的。