W projekcie statycznej biblioteki mam plik nagłówkowy z zadeklarowanymi, ale nie zaimplementowanymi funkcjami.Dlaczego to nie tworzy wielu zdefiniowanych symboli w tej bibliotece statycznej?
Mam plik .cpp, który implementuje te funkcje.
Następnie, aby lepiej zrozumieć błędy linkerów, skopiowałem plik cpp, więc mam jego dokładny duplikat, który również zostanie skompilowany. Tak więc oba pliki mają podwójne implementacje dla każdego symbolu w nagłówku.
Kompiluje, a gdy jest używany w innym projekcie, łączy.
Tutaj minimalny przykład dla biblioteki statycznej:
api.hpp:
void printWhatever();
errortest.cpp i duplicate.cpp są identyczne:
#include "api.hpp"
#include <iostream>
void printWhatever(){
std::cout << "hi " << "\n";
}
skompilować to jako statyczny biblioteka z tymi 2 plikami źródłowymi. Widzę, że kompilator generuje raporty dla obu plików.
Teraz używam tego skompilowaną bibliotekę w pliku wykonywalnego, inny projekt: main.cpp:
#include <api.hpp>
int main(int argc, const char * argv[]) {
printWhatever();
return 0;
}
To działa i drukuje "hi".
Dlaczego nie ma wielu definicji tej funkcji?
powinieneś dostać ten błąd na * etapie łączenia *, a nie podczas kompilowania –
@ m.s. dzięki i poprawiłem pytanie –
czy faktycznie łączysz dwa pliki obiektów razem? –