Cygwin なんでも掲示板

一覧最新記事過去一覧 | 検索FAQアンテナHOME
(新規投稿・発言はできません)


スレッド

└◇836:
basename() がリンクエラー, 代替手段は? [shige] 12/12 10:54

 └◇838:Re:basename() がリンクエラー, 代替手段は? [な] 12/12
  └◇839:Re: basename() がリンクエラー, 代替手段は? [foo] 12/12
   └◇851:Re[2]: basename() がリンクエラー, 代替手段は? [な] 12/13
    └◇855:Re[3]: basename() がリンクエラー, 代替手段は? [shige] 12/16 <


836● basename() がリンクエラー, 代替手段は?[ shige ] 2002 12/12 10:54
Cygwin でも自作の Tool が使いたいので、make しようとしたのですが、basename() の link に失敗します。

$ make test
gcc test.c -o test
/tmp/ccyDk98.o(.text+0x2b):test.c: undefined reference to `_basename'
collect2: ld returned 1 exit status
make: *** [test] Error 1

/* test.c */
#include <stdio.h>

int main(int argc, char** argv){
printf("%s\n",basename(argv[0]);
return 0;
}

basename() が未定義だということはわかるのですが、(#include <libgen.h> 自体が失敗する) 代替手段としてどうすればよいのか、何かよい方法がありましたら、アドバイスお願いします。

現状は、

static const char* prgname = "defaultname";

#ifndef __CYGWIN__
{
#include <libgen.h>
progname = basename(argv[0]);
}
#endif

としていますが美しくないです。。。
スレッド一覧


838● Re:basename() がリンクエラー, 代替手段は?[ な ] 2002 12/12 12:29
まず、newlib-manパッケージが入っていれば、
# 入っていなければ、いますぐに入れてください。
man 3 basename してください。

Cygwinで使っているnewlibには、basename()はありません。
# glibcのmanには、conforming to SUSv2とありますね。

ロジックは難しくないので、練習と思って自作してみては?
スレッド一覧


839● Re: basename() がリンクエラー, 代替手段は?[ foo ] 2002 12/12 13:53
> Cygwinで使っているnewlibには、basename()はありません。



libiberty.a に入っています。
スレッド一覧


851● Re[2]: basename() がリンクエラー, 代替手段は?[ な ] 2002 12/13 13:10
> libiberty.a に入っています。

本気ですか?

http://gcc.gnu.org/onlinedocs/libiberty/Using.html によれば、

> Possibly the easiest way to use libiberty in your projects
> is to drop the libiberty code into your project's sources.

つまり、libibertyのソースを自分のプロジェクトのソースに入れて
しまいなさいとあるのですが。

システムにあるからといって、安易にバイナリを使うのは考えもの
でしょう。

なお、basename()の実装としては、sh-utilsのソースにもあります。
# src/ と lib/ に分かれていますが。
スレッド一覧


855● Re[3]: basename() がリンクエラー, 代替手段は?[ shige ] 2002 12/16 10:07
結局自作しました。

単に、

if(argv[0]){
char* p = strrchar(argv[0],'/');
prgname = (p && *++p) ? p : argv[0];
}

としました。

ところで、SUSv2 という物について調べているのですが、毎度探し方が悪いようで、こういった、POSIX だとか、BSD だとか、たとえば、RedHat Linux はどれに準拠していて、Cygwin だとどうだ、という風に整理さえていて、勉強できる資料を見つけられませんでした。

お勧めのページなどありましたら、お願いいたします。
スレッド一覧

早田のホームページへ
CGIROOM