質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

2666閲覧

Undefined symbols for architecture x86_64: "◯◯◯", referenced from:

nyamagoyaki

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/07/13 13:49

編集2021/07/14 04:43

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(); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/07/13 14:00

`../lib/libsock.a` が未知のファイル形式なので無視したって言ってますね。 だから`_ServerSocket`の参照も解決されずエラーとなったわけですね。 OSはMacOSですか? ターミナルで `file ../lib/libsock.a` を実行したらどう表示されますか?
nyamagoyaki

2021/07/14 00:07

../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) となっていて正しいフォルダの位置にあることはみたのですが、、、
itagagaki

2021/07/14 00:25

あ、すみません。file ../lib/lib/libsock.a ですね。
nyamagoyaki

2021/07/14 00:44

対象にしているコードが、2002年の本で、RedHat 7.0Jで開発していたらしいので、、、
itagagaki

2021/07/14 00:45

リンカに指定した libsock.a がMacOS用でないものだったっぽいので file コマンドで確かめてみてもらいたいのです。
nyamagoyaki

2021/07/14 00:49

libsock.a: current ar archive と出てしまいます。
itagagaki

2021/07/14 00:56

ふむ、objdump -f ../lib/lib/libsock.a はどうですか
nyamagoyaki

2021/07/14 01:00

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 と出ました。
itagagaki

2021/07/14 01:11

Mac用のオブジェクトファイルのようですね では、もしかしてccやldがMac用じゃないとか? cc -dumpmachine って実行できますか?
nyamagoyaki

2021/07/14 01:25

x86_64-apple-darwin20.4.0 と出ました。
guest

回答2

0

一番怪しいのは libsock.a です。
これ、元からあるか別途インストールされたものかと思っていたのですが、もしかしてこれも自分のプロジェクトで生成したものですかね。そう言えばパスも ../lib/lib って作業ディレクトリからの相対パスになっているということは、このプロジェクトで(makefileで)生成しているっぽいですね。
まずはmakefileでlibsock.aの生成が行われているところを調べてみてください。
もしあれば、そこでarとかranlibといったコマンドを使っていると思います。
それが、そのマシンのOSの標準のもの(たぶん/usr/bin/arや/usr/bin/ranlib)ではなく、別の場所(たとえば/usr/local/binなど)にインストールされた別アーキテクチャ用のバージョンが動いてしまっていたという可能性があると思います。
もしそうなら、それらのパスを適正なパスにしてmakeしなおしてみてください。
makeしなおす前に make clean が必要ですが、cleanターゲットが無いのなら、各ディレクトリに生成された *.o *.a を手で消してください。

投稿2021/07/14 04:02

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyamagoyaki

2021/07/14 04:46

現在やりたいことがdnsディレクトリのMakefileです。 本の著者によると、関数群などは全て自作ですね。 *.oと*.aファイルを全て消してarでそれぞれ作り直しましたができませんでした。
guest

0

M1 Macをつかっていて良く起きる問題のようです。

Xcodeを使っているなら、XCodeのアーキテクチャ設定変更

最終的には、Valid Architectureに
$(ARCHS_STANDARD)
を入力するとエラーがでなくなります。

というあたりをやってみると動くかもしれません。
ただし、こういうことをやる場合には、必ずmake cleanをやってください。別のアーキテクチャのオブジェクトが残っているとだめです。

追記
画像を見ると、Xcodeではなさそうですね、
M1 Mac x86_64 aarch64 でググればヒントが出てくるでしょう。

投稿2021/07/14 01:27

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyamagoyaki

2021/07/14 01:32

M1 mac ではないし、make clean ができないのですが、どうすればよろしいでしょうか??
itagagaki

2021/07/14 03:03

makefileも質問に載せていただけるといいんですけど、巨大 or たくさんある感じですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問