0

Linux では警告なしで正常にコンパイルおよび実行される C プログラムがありますが、SunOS でコンパイルしようとすると、次の警告が表示されます。

test.c: In function `my_function':
test.c:412: warning: implicit declaration of function `strerror_r'
Undefined                       first referenced
 symbol                             in file
strerror_r                          /var/tmp/ccRiPoGl.o
ld: fatal: Symbol referencing errors. No output written to test
collect2: ld returned 1 exit status
make: *** [test] Error 1

何か案は?

4

4 に答える 4

2

「暗黙の宣言」警告は、あなたが持っているヘッダーのどれも#includeその関数を定義していないことを示しており、「未定義のシンボル」警告は、関数自体がリンクしているどのライブラリでも定義されていないことを示していますの。

まとめると、これは、コンパイルしている C ライブラリがstrerror_r関数を提供していないことを意味します。独自の代替手段をロールバックする必要があります。

たとえば、 を使用している場合は、次のpthreadsようにすることができます。

int my_strerror_r(int errnum, char *buf, size_t buflen)
{
    static pthread_mutex_t strerror_lock = PTHREAD_MUTEX_INITIALIZER;

    if (!buflen)
    {
        errno = ENOSPC;
        return -1;
    }

    buf[0] = 0;

    pthread_mutex_lock(&strerror_lock);
    strncat(buf, strerror(errnum), buflen - 1);
    pthread_mutex_unlock(&strerror_lock);

    return 0;
}
于 2009-12-13T02:18:14.660 に答える
1

そのプラットフォームでは strerror_r が利用できないようです。古い Solaris 2.8 ボックスを確認したところ、strerror_r が利用できません。

strerror を使用し、スレッド セーフの欠如による不正確な結果に対処する必要があるようです。

于 2009-12-13T02:14:31.117 に答える
0

LinuxSunOSは異なるオペレーティング システムであり、使用している機能の実装が異なる可能性があります。

イリノイ州シカゴ大学の Bernstein 博士による POSIX 互換性に関する次の記事が役立つ場合があります。

http://cr.yp.to/docs/unixport.html

幸運を、

-億

于 2009-12-13T02:21:12.767 に答える
0

ライブラリを指定するためにリンカに追加のヒントを与える必要があるように思えます.Linuxの場合のように標準パスにない場合があります.ライブラリの名前がわかっている場合は、ライブラリパスをSunOS で gcc または同等のものを呼び出すときの CLI コンパイラ。

makefile で LIBS 変数を使用する例を次に示します。

LIBS = -L/usr/lib -L/usr/sys/lib -lsome_lib1 -lsome_lib2

これは、makefile でコンパイラを呼び出すために使用される行です。上記で示したように、LIBS 変数への参照に注意してください。

$(CC) -o $@ $(FILES) $(LIBS) $(CFLAGS)

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2009-12-13T02:08:14.450 に答える