C ++库周围的C包装程序,没有不必要的头文件

时间:2018-06-30 16:43:29

标签: c++

C ++新手在这里。我正在围绕C ++库创建一个C包装程序,该包装程序仅公开foo()函数。

wrapper.h

#include "SomeLibrary.h"
#include "SomeAnotherLibrary.h"

#ifdef __cplusplus
extern "C" {
#endif
  void foo();
#ifdef __cplusplus
}
#endif

wrapper.cpp

#include "wrapper.h"

void foo() {
  // calls to `SomeLibrary.h` and `SomeAnotherLibrary.h` functions...
}

我想编译此代码只是为了能够从其他C代码中调用foo()。请注意,我只关心foo()函数。我想完全忽略SomeLibrary.hSomeAnotherLibrary.h头文件。

因此,我尝试将包装程序编译为目标文件wrapper.o,如下所示:

g++ -c wrapper.cpp -o wrapper.o -I../some_library/include -I../some_other_library/include -L../some_library/lib -lSomeFirstLibrary -lSomeSecondLibrary

问题

当我在C项目中使用wrapper.o时,仍然需要我从SomeLibrary.hSomeAnotherLibrary.h(我根本不在乎)中加载头文件。这是我的C项目代码:

my_project.c

#include "wrapper.h"

void main() {
  foo();
}

并编译它:

gcc my_project.c wrapper.o -o my_project

哪个会产生以下错误:

my_program.c:3:28: fatal error: SomeLibrary.h: No such file or directory

问题

我应该如何编译包装程序以忽略除wrapper.h之外的所有其他头文件?

2 个答案:

答案 0 :(得分:3)

删除

&#x00A0;<fo:block/>

#include "SomeLibrary.h" #include "SomeAnotherLibrary.h" 开始,并将这些行放在wrapper.h旁边的wrapper.cpp中。

然后从

删除与#include "wrapper.h"链接器相关的标志
-L../some_library/lib -lSomeFirstLibrary -lSomeSecondLibrary

命令(g++ -c wrapper.cpp -o wrapper.o -I../some_library/include -I../some_other_library/include 表示此处未进行任何链接,因此没有必要传递链接器标志)

并将其移至

-c

这样的命令。

然后它应该工作。

答案 1 :(得分:1)

当您收到undefined reference to...条消息时,表示您正在声明函数并调用它们,但从未定义它们。错误源于您在错误的位置链接库的事实。您无需将库链接到.o文件,而需要将它们链接到可执行文件。