Фон
У меня есть следующий исходный код
#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
, и у меня просто остаются ошибки функций.
Мой вопрос
Здесь я хочу узнать две вещи:
- Как должен выглядеть мой make-файл для решения моей конкретной проблемы
- Каково общее решение моей проблемы?Я предполагаю, что это как-то связано с последовательными директивами
#include
и необходимостью использовать pkg-config
, чтобы это исправить, но я не уверен.