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
之外的所有其他头文件?
答案 0 :(得分:3)
删除
 <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
文件,而需要将它们链接到可执行文件。