g_object_set 来自 MacPorts 的 glib 链接器错误

g_object_set linker error with glib from MacPorts

在使用 cmake 构建项目(使用 GStreamer 1.0,因此依赖于 Glib 2.0)并链接到 glib 库时,我遇到了一个奇怪的链接器错误。 Glib 使用 macports 安装,libglib-2.0.0.dylib 存在于 /opt/local/lib/ 中。 FindGLIB 成功找到它的头文件(编译工作)并且 ${GLIB_LIBRARIES} 提供了正确的库路径。

错误信息是

[100%] Linking CXX executable ../bin/presenter
Undefined symbols for architecture x86_64:
  "_g_object_set", referenced from:
  ...
  "_g_type_check_instance_cast", referenced from:
  ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果我从列表中完全删除 glib,它还会抱怨缺少对 g_print 和 g_print 的引用。是否有可能链接已正确完成,但库中由于某种原因缺少函数?

我该如何解决?

终于找到我的错误了。当使用 Webkit 项目的 FindGLIB 时,它默认只搜索主要的 glib 库。它的组件除了被发现之外还必须通过:

find_package(GLIB COMPONENTS gobject REQUIRED)

会找到 glib 本身并将其保存在 ${GLIB_LIBRARIES} 中,也会找到 gobject 并将其保存在 ${GLIB_GOBJECT_LIBRARIES} 中以便它们可以在 target_link_libraries()

中使用

提醒:始终阅读文件中的评论 headers - 它们通常包含有用的信息...

# Optionally, the COMPONENTS keyword can be passed to find_package()
# and Glib components can be looked for.  Currently, the following
# components can be used, and they define the following variables if
# found:
#
#  gio:             GLIB_GIO_LIBRARIES
#  gobject:         GLIB_GOBJECT_LIBRARIES
#  gmodule:         GLIB_GMODULE_LIBRARIES
#  gthread:         GLIB_GTHREAD_LIBRARIES