围绕 C++ 库的 C 包装器,没有不必要的头文件

Posted

技术标签:

【中文标题】围绕 C++ 库的 C 包装器,没有不必要的头文件【英文标题】:C wrapper around C++ library without unnecessary header files 【发布时间】:2018-06-30 16:43:29 【问题描述】:

这里是 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 之外的所有其他头文件?

【问题讨论】:

附注:使用ìnt main 而不是void main 【参考方案1】:

删除

#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 表示此处未进行链接,因此没有必要传递链接器标志)

并将其移至

gcc my_project.c wrapper.o -o my_project -L../some_library/lib -lSomeFirstLibrary -lSomeSecondLibrary

这样的命令。

那么它应该可以工作了。

【讨论】:

它删除了缺少的标头错误。但是,现在我收到了很多 undefined reference to 消息。 这是一个进步,尽管现在事情已经编译并且错误现在在链接器中。添加-L../some_library/lib -lSomeFirstLibrary -lSomeSecondLibrary 应该可以解决问题(这些也不需要在g++ -c wrapper.cpp ... 命令中,因为该命令不进行任何链接)。 @user1518183 Nemáš za co.【参考方案2】:

当您收到undefined reference to... 消息时,这意味着您正在声明函数并调用它们,但从未定义它们。错误来自您将库链接到错误的位置这一事实。您不需要将库链接到.o 文件,您需要将它们链接到可执行文件。

【讨论】:

以上是关于围绕 C++ 库的 C 包装器,没有不必要的头文件的主要内容,如果未能解决你的问题,请参考以下文章

如何围绕 C++ 代码编写 C 包装器以公开类方法

如何将围绕 C++ 函数的 R 包装器转换为 Python/Numpy

C++ 库的 JNI 包装器和未定义的符号错误

C++库的头文件到底如何包含的?

使用 SWIG 围绕 C++ 的 Python 包装器。参数类型无法识别

从 C# 调用 C++ dll 方法/类