C言語でmakeを実行したいのですが、タイトル通り、次のようなエラーが出てしまいます。
dnsディレクトリのMakefileでmakeを実行したのですが、これは関数が参照されていないのでしょうか?
例えば、ServerSocket関数は、/lib/socketディレクトリにあります。
これを使うには直接使いたいファイルにプロトタイプ宣言するだけでなく、処理自体も全て書かなくてはならないのでしょうか?
cc -Wall -g -I../lib/include -o dnsproxy main.o proxy.o log.o -lresolv -L../lib/lib -lsock -ltoken -ldaemon -lprofile ld: warning: ld: warning: ignoring file ../lib/lib/libsock.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A 0x2F 0x20 0x20 0x20 0x20 0x20 0x20 0x20 ) ld: warning: ignoring file ../lib/lib/libdaemon.a, building for macOS-x86_64 but attempting to link with file built for macOS-x86_64 ignoring file ../lib/lib/libprofile.a, building for macOS-x86_64 but attempting to link with file built for macOS-x86_64 ld: warning: ignoring file ../lib/lib/libtoken.a, building for macOS-x86_64 but attempting to link with file built for macOS-x86_64 Undefined symbols for architecture x86_64: "_ServerSocket", referenced from: _main in main.o "_ServerSocketU", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [dnsproxy] Error 1
#include "inc.h" #include "base.h" #define TIMEOUT_SEC (30) #ifndef SIGCLD # define SIGCLD SIGCHLD #endif int Soc=0; int SocU=0; static int TotalNo=0; static int InitExecTable(); static int CheckExecTable(int pid); static int TestExecTable(); static int AddExecTable(int pid); static void EndSignal(int sig); static void EndChild(int sig); static int InitSignal(); static int CloseSocket(); static int MainLoop(); static int OneClient(int acc,char *client_address); static int OneClientU(int soc_u); #define MAX_EXEC 10 typedef struct { int pid; time_t t; }EXEC_TABLE; EXEC_TABLE ExecTable[MAX_EXEC]; int main(int argc,char *argv[]) { char port[80]; int i,is_daemon=0; strcpy(port,"domain"); for(i=1;i<argc;i++){ if(strcmp(argv[i],"-d")==0){ lprintf("Daemon mode\n"); is_daemon=1; } else{ strncpy(port,argv[i],sizeof(port)-1); } } if(is_daemon){ InitDaemon(argv[0],0,0); log_out_dbg_off(); } lprintf("DnsProxy start\n"); lprintf("port=%s\n",port); ReadParam(); if((Soc=ServerSocket(port,-1))==-1){ exit(-1); } if((SocU=ServerSocketU(port,-1))==-1){ exit(-1); } InitSignal(); InitExecTable(); MainLoop(); CloseSocket(); }
`../lib/libsock.a` が未知のファイル形式なので無視したって言ってますね。
だから`_ServerSocket`の参照も解決されずエラーとなったわけですね。
OSはMacOSですか?
ターミナルで
`file ../lib/libsock.a`
を実行したらどう表示されますか?
../lib/libsock.a: cannot open `../lib/libsock.a' (No such file or directory)
と出てしまいました。
Makefileでは
OBJS=main.o proxy.o log.o
SRCS=$(OBJS:%.o=%.c)
CFLAGS=-Wall -g -I../lib/include
LDLIBS= -lresolv -L../lib/lib -lsock -ltoken -ldaemon -lprofile
TARGET=dnsproxy
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LDLIBS)
となっていて正しいフォルダの位置にあることはみたのですが、、、
あ、すみません。file ../lib/lib/libsock.a ですね。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10227117805
ここのURLで見つけたのですが、
ld: warning: ignoring file ../lib/lib/libtoken.a, building for macOS-x86_64 but attempting to link with file built for macOS-x86_64
と出ているということは、macではできないということでしょうか??
対象にしているコードが、2002年の本で、RedHat 7.0Jで開発していたらしいので、、、
リンカに指定した libsock.a がMacOS用でないものだったっぽいので file コマンドで確かめてみてもらいたいのです。
libsock.a: current ar archive
と出てしまいます。
ふむ、objdump -f ../lib/lib/libsock.a はどうですか
In archive libsock.a:
sock.o: file format mach-o-x86-64
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000
と出ました。
Mac用のオブジェクトファイルのようですね
では、もしかしてccやldがMac用じゃないとか?
cc -dumpmachine って実行できますか?
x86_64-apple-darwin20.4.0
と出ました。