在 C++ class 实现中调用 C 函数

Call C function in C++ class implementation

我必须使用 https://github.com/google/gumbo-parser 用 C 编写的库。

我有一个在 HtmlParser.h 中定义的 HtmlParser class,我在 HtmlParser.cpp

中实现了它的方法

我在 HtmlParser.h 中包含 gumbo.h 并在 HtmlParser.cpp

中调用由我实现的 getLinks(...) 函数中的函数

当我尝试编译它时,我得到 undefined reference to 'gumbo_parse' 我该如何解决?

我的 makefile 是

cmake_minimum_required(VERSION 3.3)
project(WebCrawler)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp HtmlParser.cpp HtmlParser.h)
add_executable(WebCrawler ${SOURCE_FILES})

undefined reference 是 link 时的错误。这意味着您正在使用的符号(函数)以及在编译编译单元时找到定义的符号(函数)无法在 link 时解析为 link 反对。

如果你只构建一个命令,你可能只需要在你的命令行中添加一个 -lgumbo,如果它不在默认的 lib 路径中,最后添加 -L<path to directory containing libgumbo.so>。通常:

g++ main.cc -lgumbo

或者如果 gumbo lib 和 headers 在 gumbo 子目录中:

g++ main.cc -I/usr/local/include/gumbo/ -L/usr/local/lib/gumbo/ -lgumbo

如果您构建多个命令行(首先构建 objects,然后 linking 它们,那么您需要添加 -l(最终 -L) link 命令的选项:

g++ main.cc -o main.o # This is the objects building command
g++ main.o -l gumbo   # This is the linking command

编辑: 使用 cmake(我现在看到您正在使用),您必须说明您正在使用 gumbo 库。这应该使用 find_library:

来完成
find_library(gumbo)

如果不支持,您可能需要使用 link_directories to specify where to find it. Then use target_link_libraries 将此库指定为 link 作为您的目标。