次のfoo.cをコンパイルしようとしています。
#include <systemd/sd-journal.h>
int main(int argc, char *argv[]) {
sd_journal_print(LOG_NOTICE, "Hello World");
return 0;
}
そして
gcc `pkg-config --cflags --libs libsystemd` foo.c
ldエラーが発生しました:
undefined reference to 'sd_journal_print_with_location'
実行するとnm /lib/x86_64-linux-gnu/libsystemd.so.0.14.0
(ライブラリにこの関数と他のsd_関数の定義を含める必要があると思います)、次の結果が表示されます。記号はありません。 (他のシンボルリストユーティリティと同じ結果)
シンボルのない共有ライブラリ?
私はUbuntu 16.04を使用しており、aptを使用してlibsystemd-devをインストールしました。一部のソースではlibsystemd-journal-devを参照していますが、私のディストリビューションにはそれがあるとは思いません。
私がやりたいことは、systemdのログを使用してシステム全体のロギングを実行する方法を見つけることです。私はおそらくsyslogを使用でき、後でsystemdを使用することを知っていますが、ここで何が起こっているのか理解したいと思います。
ベストアンサー1
これは動的記号です。
$ nm -D /lib/x86_64-linux-gnu/libsystemd.so.0.25.0 | grep sd_journal_print_with_location
0000000000026ec0 T sd_journal_print_with_location
プログラムをビルドするには、ユーザーの後にライブラリを指定する必要があります。
gcc $(pkg-config --cflags libsystemd) foo.c $(pkg-config --libs libsystemd)
必要なパッケージはですlibsystemd-dev
。