标题未被识别

时间:2011-06-17 00:16:03

标签: c++ include makefile

背景

我有以下源代码

#include <libubuntuone-1.0/u1-music-store.h>
#include <libsyncdaemon-1.0/libsyncdaemon/libsyncdaemon.h>

static void
get_credentials (U1MusicStore *music_store,
                                 gchar **oauth_consumer_token,
                                 gchar **oauth_consumer_secret,
                                 gchar **oauth_token,
                                 gchar **oauth_token_secret)
{
    SyncdaemonCredentials *credentials;
    *oauth_consumer_token = *oauth_consumer_secret = *oauth_token = *oauth_token_secret = NULL;

    *oauth_consumer_token = g_strdup (syncdaemon_credentials_get_consumer_key (credentials));
    *oauth_consumer_secret = g_strdup (syncdaemon_credentials_get_consumer_secret (credentials));
    *oauth_token = g_strdup (syncdaemon_credentials_get_token (credentials));
    *oauth_consumer_secret = g_strdup (syncdaemon_credentials_get_token_secret (credentials));
}

int main() 
{
    return 0;
}

我正在使用以下makefile编译它

main: main.o
    g++ main.o -o main

main.o: main.cpp
    g++ -c main.cpp `pkg-config --cflags --libs gtk+-2.0`

我需要包含pkg-config选项,因为u1-music-store.h标头试图包含gtk/gtk.h,但编译器无法自己找到它。

libsyncdaemon.h是一个元标题,其唯一目的是包含更大的标题列表,可以在下面看到

#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-authentication.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-config-interface.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-credentials.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-daemon.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-events-interface.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-file-info.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-filesystem-interface.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-folder-info.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-folders-interface.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-interface.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-publicfiles-interface.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-share-info.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-status-info.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-status-interface.h>
#include <libsyncdaemon-1.0/libsyncdaemon/syncdaemon-transfer-info.h>

我的问题

每当我尝试编译代码时,都会收到以下错误:

main.o: In function `get_credentials(_U1MusicStore*, char**, char**, char**, char**)':
main.cpp:(.text+0x34): undefined reference to `syncdaemon_credentials_get_consumer_key'
main.cpp:(.text+0x3c): undefined reference to `g_strdup'
main.cpp:(.text+0x4e): undefined reference to `syncdaemon_credentials_get_consumer_secret'
main.cpp:(.text+0x56): undefined reference to `g_strdup'
main.cpp:(.text+0x68): undefined reference to `syncdaemon_credentials_get_token'
main.cpp:(.text+0x70): undefined reference to `g_strdup'
main.cpp:(.text+0x82): undefined reference to `syncdaemon_credentials_get_token_secret'
main.cpp:(.text+0x8a): undefined reference to `g_strdup'
collect2: ld returned 1 exit status
make: *** [main] Error

使用grep,我已将四个syncdaemon_credentials_get_*函数追踪到syncdaemon-credentials.h,我希望编译器能够找到它,因为它列在libsyncdaemon.h中,但由于某种原因,这没有发生。我假设这是因为u1-music-store.h无法找到gtk/gtk.h迫使我在makefile中使用pkg-config选项,但我很难理解为什么这是偶数这个案子一开始。如果文件是#included,我希望编译器能够包含它。

再次使用grep我能够跟踪g_strdup到多个标题,但我也发现当我用makefile替换单个命令时

g++ main.cpp -o main `pkg-config --cflags --libs gtk+-2.0`

我可以消除g_strdup警告,我只剩下功能错误。

我的问题

我在这里有两件事要知道:

  1. 为了解决我的具体问题,我的makefile应该是什么样子
  2. 我的问题的一般解决方案是什么?我猜它与雏菊链#include指令有关,并且必须使用pkg-config来解决这个问题,但我不确定。

2 个答案:

答案 0 :(得分:4)

  1. 您需要链接libsyncdaemon.so。从pkg-config ... libsyncdaemon-1.0获取适当的参数。

  2. 您需要链接导出所需符号的库。如果有.pc文件,那么您可以使用它来获取适当的参数。

答案 1 :(得分:1)

“未解析的外部符号”(MSVC)和“未定义的引用”(GCC)表示编译器找到声明,但链接器找不到定义
这意味着您忘记编译和/或链接.cpp或忘记链接外部库(.lib (Windows) / .a (Unix/Linux))或目标文件({{1} })包含所述定义。