▼スレッド
│
└◇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 <
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
としていますが美しくないです。。。
まず、newlib-manパッケージが入っていれば、スレッド一覧
# 入っていなければ、いますぐに入れてください。
man 3 basename してください。
Cygwinで使っているnewlibには、basename()はありません。
# glibcのmanには、conforming to SUSv2とありますね。
ロジックは難しくないので、練習と思って自作してみては?
> Cygwinで使っているnewlibには、basename()はありません。スレッド一覧
libiberty.a に入っています。
> 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/ に分かれていますが。
結局自作しました。スレッド一覧
単に、
if(argv[0]){
char* p = strrchar(argv[0],'/');
prgname = (p && *++p) ? p : argv[0];
}
としました。
ところで、SUSv2 という物について調べているのですが、毎度探し方が悪いようで、こういった、POSIX だとか、BSD だとか、たとえば、RedHat Linux はどれに準拠していて、Cygwin だとどうだ、という風に整理さえていて、勉強できる資料を見つけられませんでした。
お勧めのページなどありましたら、お願いいたします。