围绕 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.h
和 SomeAnotherLibrary.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.h
和 SomeAnotherLibrary.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++ 函数的 R 包装器转换为 Python/Numpy