2012-01-25 20 views
1

私は、1つのlibへの参照を持つオブジェクトコードをコンパイルしようとしています。これはlibexample.cのコードです:別のライブラリの関数への未定義の参照

#include "libexample.h" 
#include <signal.h> 
#include <time.h> 

timer_t sched; 
struct itimerspec timer = {{0, 0}, {0, 0}}; 

void init() { 
    struct sigaction sa; 

    sigemptyset(&sa.sa_mask); 
    sigaction(SIGALRM, &sa, NULL); 

    timer_create(CLOCK_PROCESS_CPUTIME_ID, NULL, &sched); 
    timer_settime(sched, TIMER_ABSTIME, &timer, NULL); 
} 

とサンプルプログラムの簡単なコード:

gcc libexample.c -c -lrt -o libexample.o 
gcc example.c -lrt ibexample.o -o example 

そして、私はこのとき取得:

#include "libexample.h" 

int main() { 
    init(); 
    return 0; 
} 

私はコンパイルするためにこれを使用します私は2行目でコンパイルしようとしています:

./libexample.so: undefined reference to `timer_create' 
./libexample.so: undefined reference to `timer_settime' 

誰かが私が間違っていることを知っていますか?

+0

申し訳ありませんが、変更点については、-lrtでも問題が発生します。 –

+1

これはgccへのパラメータの順序に過ぎませんでした。 -lrtを行末に置くと、問題が解決されます。 ありがとう –

答えて

1

man timer_createコマンドexplainsあなたは:

NAME 
    timer_create - create a POSIX per-process timer 

SYNOPSIS 
    #include <signal.h> 
    #include <time.h> 

    int timer_create(clockid_t clockid, struct sigevent *sevp, 
        timer_t *timerid); 

    Link with -lrt. 

ですから、ドキュメントが言うように、-lrtとリンクする必要があります。

だからあなたlibexample.soを生成するために

gcc libexample.c -fPIC -shared -o libexample.so -lrt 

を使用しています。 undur_gongorとして

コメントし、あなたがgccまたはldコマンドで(gcc引数の通常の順序は、依存関係の順序でソースファイル、オブジェクトファイル、ライブラリである)すべての残りの部分の後の良い順にライブラリを配置する必要があり(そしてそれが文書化されていますldのドキュメント、およびgccのもの)。従って-lrtは最後に行くべきです。

マニュアルページを読むことを学びます。

+1

質問のコマンドラインに '-lrt'があります。重要なオプションの順序です。 –

+0

@undur_gongorは質問 '-lrt'の最初のバージョンでも存在しませんでした。 – ouah

+0

@ouah:はい、明らかです。残念ながら、質問を作成した後の迅速な編集は、そのように文書化されていません。 –

3

リンクコマンドに-lrtを追加します。 timer_createおよびtimer_settimeは、C標準ライブラリの一部ではありません。

gcc -fPIC -shared libexample.c -lrt -o libexample.so 
gcc -L. example.c -lexample -o example 
0

cmakeを使用している場合は、target_link_libraries()を使用してライブラリを含めてください。たとえば、timer_create()のようなタイマー機能の場合は、"rt"が、pthreadの場合は、target_link_libraries()を使用して"pthread"が追加されている必要があります。

関連する問題