2012-08-26 17 views
9

Powiedzmy, że znajduję bardzo ładną bibliotekę otwartego źródła w Internecie i teraz chcę użyć jej do mojego własnego projektu.w tym zewnętrzne nagłówki ustalające opcje kompilatora

ją pobrać, ewentualnie go skompilować i pobrać pliki nagłówkowe & statyczne/dynamiczne biblioteki.

Więc zacznę pisać własne pliki źródłowe i oczywiście, gdy chcę korzystać z tej funkcjonalności zewnętrznej biblioteki I obejmują prawo nagłówki go do moich plików źródłowych.

Teraz mogę skompilować mój plik źródłowy, upewnij się, że obejmują ścieżki i opcje linkera dla tej zewnętrznej biblioteki są ustawione prawidłowo.

I dostaję mnóstwo błędów, wszystkie pochodzące z zewnętrznych nagłówków. Okazuje się, że wymagają one niektórych flag kompilatora.

Jak znaleźć minimalne flagi kompilatora, które muszę ustawić (aby móc kompilować nagłówki z biblioteki zewnętrznej)?

Co myślałem o nim do tej pory:

  1. Sprawdzić je w skrypcie budynku źródła (może być dość trudne, ponieważ istnieje wiele miejsc, w których mogą być zdefiniowane i mogą one nie być minimalne flagi, ponieważ mogą one być wymagane dla wszystkich nagłówków razem, ale nie dla tych szczególnych używam)
  2. Google każdy komunikat o błędzie i mam nadzieję, że dam odpowiedź (może być trudne z wielu komunikatów o błędach i Google może nie znać odpowiedzi lub nie znam odpowiednich słów kluczowych, aby znaleźć odpowiedź)
  3. Może niektóre jak "dołączyć" skrypt budujący bibliotekę zewnętrzną do mojego własnego projektu (może być bardzo trudny, ponieważ mógłbym chcieć użyć innego systemu kompilacji i prawdopodobnie musiałbym w pełni zrozumieć system budowy, co może być trudne większe biblioteki)
+0

to wygląda na to, że zazwyczaj jest to problem z systemem kompilacji? Dlaczego dołączasz do swojego projektu drugi kod źródłowy, zamiast korzystać z innego systemu budowania projektów? Wiem, że systemy konstrukcyjne to ból w dupie, ale to, do czego zostały stworzone. – Alex

+0

Dołączam tylko nagłówki innego projektu. Nie wiem, jak mam używać definicji c/++ w innym projekcie bez nagłówków. – DevBen

Odpowiedz

1

Wszelkie dobrze wychowane statki bibliotek open source z instrukcją, w jaki sposób korzystać ze swoich plików rozwojowych. Na GNU/Linux, to zwykle mają pkg-config pliki (* .pc) zainstalowane razem do nagłówków rozwoju i bibliotek, w którym to przypadku pkg-config --cflags library-name powie o wymaganych opcji kompilacji.

Gdzie pkg-config może być używany, to tylko kwestia informowanie systemu kompilacji o komponentach, które chciałbyś zaimportować, np. o autotoolach

PKG_CHECK_MODULES([DEPS], [libname]) 

Następnie użyj zmiennych DEPS_CFLAGS i DEPS_LIBS dla plików .am.

E.g. na powłoka wiersza polecenia:

$ gcc $(pkg-config --cflags libname) -c main.c 
$ gcc $(pkg-config --libs libname) main.o -o test.exe 

Zresztą byłoby bardziej produktywne, jeśli można dodawać konkretne informacje o wykorzystanej biblioteki i jakie są błędy generowane.

+0

oh wow, nie wiedziałem nawet o pkg-config, ale to brzmi jak świetne rozwiązanie. Czy pkg-config jest bardzo popularny wśród bardziej popularnych projektów open source? Nie masz żadnej porady na temat strategii, której mógłby użyć ktoś, gdyby nie było dobrej dokumentacji na temat wymaganych flag kompilatora dla plików nagłówkowych? – DevBen

+0

tak, 'pkg-config' może być * standardem de facto * wśród projektów FOSS. Nie jestem pewien, czy rozumiem pytanie o strategię, ale zazwyczaj w systemie kompilacji jest mechanizm deklarujący pliki * .pc lub możesz po prostu zastąpić wynikami 'pkg-config --cflags libname' na wiersz poleceń. – milton

0

dla nagłówka jest to bardzo rzadko się błędy dotyczące flagi kompilatora lub jest to bardzo łatwe do rozwiązania go w tej nagłówka (na przykład za pomocą #ifdef .. # endif lub spróbuj ponownie napisz część kodu za pomocą bardziej znanego wzorca).

ale bardziej możliwy błąd jest mniej więcej tak: Ty Dołącz nagłówek bezpośrednio, ale że nagłówek jest zależny od innego nagłówka (ewentualnie z systemu lub z tej samej biblioteki) i zapomnieć o umieszczeniu ich przed głównym zawierać plik (właściwie to. jest typowym plikiem pomiędzy programistami, którzy zapominają, aby ich nagłówki były niezależne, po prostu zapominają umieścić wszystkie wymagane nagłówki swoich plików w odpowiedniej kolejności w głównym pliku włączającym).

Więc w celu zbadania tego kryterium szukać w kodzie źródłowym biblioteki (można powiedzieć, że to jest skompilowany poprawnie). zobacz, co zawiera przed głównym plikiem włączającym i może się okazać, że twój plik włączający jest zależny od zawartych w nim plików włączających.

Na przykład zarówno w MSVC, jak iw GCC, można użyć prekompilowanych nagłówków, a wszelkie uwzględnione w prekompilowanych nagłówkach zostaną dołączone automatycznie do wszystkich plików źródłowych, które go zawierają, więc jeśli zapomnisz dodać coś w jednym z publicznych nagłówków i dodasz w prekompilowanym nagłówku twój kod zostanie skompilowany poprawnie, ale jeśli ktoś uwzględni twój publiczny nagłówek, pojawi się błąd.

lub jeśli coś w private_header_1.h definiować i używać go w nagłówku publicznym, a następnie w pliku źródłowym (np impl.cpp mówisz: #include „private_header_1.h” #include«public_header.h» ponownie kod zostaną skompilowane poprawnie, ale w tym public_header.h w innym kodzie podniesie błąd

+0

Wolałbym unikać używania #ifdef ... # endif i przepisywania fragmentów kodu. Myślę, że masz dobry punkt z kolejnością dołączania nagłówka, myślę, że tam też coś może pójść nie tak. Jednak jestem bardziej zainteresowany rozwiązywaniem problemów dotyczących flag kompilatora. I nie mam pewności co do prekompilowanych nagłówków: jak działają, czy to dobry wybór ... – DevBen

+0

@ deaf7 prekompilowane nagłówki są tak piękne, że mogą znacznie skrócić czas budowy. Będziesz zawierał stabilne nagłówki (takie jak nagłówki systemowe lub standardowe nagłówki C++) w pch, a następnie kompilator skompiluje je tylko raz, nie w każdej jednostce C++, którą kompiluje i działa bardzo dobrze zarówno w MSVC, jak i GCC. ale tutaj nie mówię, aby użyć #ifdef .. # endif lub pch, zamiast tego mówię może biblioteka ma pch lub nieprawidłową kolejność włączeń, które powodują problem – BigBoss