Ich habe Probleme mit einem meiner Projekte. Es scheint, dass ich zu einer Bibliothek verlinke, die Pthread-Symbole benötigt, aber die Bibliothek selbst ist nicht mit Pthread verbunden. Die Symptome sind, dass das Programm segregiert, wenn ich versuche, es auszuführen. Ich lief:Verknüpfung mit Pthread erzwingen mit G ++
und fand es segfaults bei der Suche nach Pthread_create. Das Programm läuft, wenn ich Vorspannung von pthread erzwingen mit diesem Befehl:
LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0 ./my_program
Um dieses Problem zu lösen, ich dachte, ich würde nur my_program verbinden mit pthread im Build-Skript -lpthread. Das hat nicht funktioniert, also habe ich versucht - pthread. Hat auch nicht funktioniert. Ich konnte dies mit dem bloßen minimal reproduzieren:
echo "int main() { return 0; }" | g++ -x c++ - -pthread -lpthread -o my_program && ldd my_program
linux-vdso.so.1 => (0x00007ffe4fd08000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f150ca5c000)
/lib64/ld-linux-x86-64.so.2 (0x000055ac8c275000)
Wie Sie aus der Ausgabe von ldd sehen können, ist my_program nicht mit pthread verknüpft. Ich vermutete, dass dies passiert, weil g ++ versteht, dass ich tatsächlich keine Symbole von pthread verwende und nicht mit ihm verlinke. Also habe ich versucht, einen Anruf Hinzufügen pthread_create:
echo -e "#include <pthread.h>\n int main() { pthread_create(0,0,0,0); return 0; }" | g++ -x c++ - -pthread -o my_program && ldd my_program
<stdin>: In function ‘int main()’:
<stdin>:2:37: warning: null argument where non-null required (argument 1) [-Wnonnull]
<stdin>:2:37: warning: null argument where non-null required (argument 3) [-Wnonnull]
linux-vdso.so.1 => (0x00007ffd977f9000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fafe1bb6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fafe17f1000)
/lib64/ld-linux-x86-64.so.2 (0x0000563ee0002000)
Bitte ignorieren die Warnungen, weiß ich den Anruf pthread_create Schein ist. Der Punkt ist, dass es jetzt tatsächlich mit Pthread verknüpft ist.
Also meine Frage ist: Gibt es sowieso, um g ++ zu zwingen, mit etwas (in diesem Fall pthread) zu verknüpfen, ohne Dummy-Code mit den Symbolen hinzuzufügen?
Versuchen -Wl, - no-allow-shlib-undefined -lbrokenlib -pthread. –
Auch -Wl, - undefined = pthread_create. –
Danke für die Hilfe, aber keine von denen arbeitete leider – bofjas