Заголовки не распознаются - PullRequest
1 голос
/ 17 июня 2011

Фон

У меня есть следующий исходный код

#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;
}

, и я компилирую его со следующим make-файлом

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

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

Мне нужно включить *Параметр 1009 *, поскольку заголовок 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, что вынудило меня использовать опцию pkg-config в моем make-файле, но у меня возникли проблемы с пониманием, почему это даже так с самого начала.Если файл имеет значение #included, я ожидаю, что он будет включен компилятором.

Используя снова grep, я смог отследить g_strdup до количества заголовков, но я также обнаружил, что когдаЯ заменил makefile одной командой

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

Я могу удалить предупреждение g_strdup, и у меня просто остаются ошибки функций.

Мой вопрос

Здесь я хочу узнать две вещи:

  1. Как должен выглядеть мой make-файл для решения моей конкретной проблемы
  2. Каково общее решение моей проблемы?Я предполагаю, что это как-то связано с последовательными директивами #include и необходимостью использовать pkg-config, чтобы это исправить, но я не уверен.

Ответы [ 2 ]

4 голосов
/ 17 июня 2011
  1. Вам необходимо создать ссылку на libsyncdaemon.so. Получите соответствующие аргументы от pkg-config ... libsyncdaemon-1.0.

  2. Вам необходимо создать ссылку на библиотеки, которые экспортируют необходимые символы. Если есть файл .pc, вы можете использовать его для получения соответствующих аргументов.

1 голос
/ 17 июня 2011

«Неразрешенный внешний символ» (MSVC) и «неопределенная ссылка на» (GCC) означают, что компилятор обнаружил объявления , но компоновщик не смог найти определения .
Это либо означает, что вы забыли скомпилировать и / или создать ссылку на .cpp, либо что вы забыли создать ссылку на внешнюю библиотеку (.lib (Windows) / .a (Unix/Linux)) или объектный файл (.o), который содержит указанные определения.

...