如何将C文件链接到两个可执行文件

时间:2019-02-03 19:20:11

标签: c makefile

我有一个名为wrapsock.c的文件,该文件具有用于socket.h头文件的多个包装函数。我有两个可执行文件FTP_client和FTP_server,它们都需要使用wrapsock.c文件。我的makefile遇到麻烦,无法将wrapsock.c文件链接到这两个程序

这是我的以下makefile:

all: ./bin/FTP_client ./bin/FTP_server

bin/FTP_client: main_client.o wrapsock.o
    gcc -o bin/FTP_client main_client.o wrapsock.o -lpthread -g
    mv main_client.o ./bin
    mv wrapsock.o ./bin

bin/FTP_server: main_server.o wrapsock.o
    gcc -o bin/FTP_server main_server.o wrapsock.o -lpthread -g
    mv main_server.o ./bin
    mv wrapsock.o ./bin

main_client.o: src/main_client.c
    gcc -c src/main_client.c -g

wrapsock.o: src/wrapsock.c src/wrapsock.h
    gcc -c src/wrapsock.c -g

main_server.o: src/main_server.c
    gcc -c src/main_server.c -g

clean:
    rm ./bin/*.o
    rm ./bin/FTP_client
    rm ./bin/FTP_server

这是我收到的错误:

gcc -c src/main_client.c -g
gcc -c src/wrapsock.c -g
gcc -o bin/FTP_client main_client.o wrapsock.o -lpthread -g
mv main_client.o ./bin
mv wrapsock.o ./bin
gcc -o bin/FTP_server main_server.o wrapsock.o -lpthread -g
gcc: error: wrapsock.o: No such file or directory
make: *** [makefile:9: bin/FTP_server] Error 1

2 个答案:

答案 0 :(得分:4)

mv wrapsock.o ./bin
gcc -o bin/FTP_server main_server.o wrapsock.o -lpthread -g
gcc: error: wrapsock.o: No such file or directory

要移动对象不是一个好方法,请像对可执行文件一样直接在目录库中创建对象:

all: ./bin/FTP_client ./bin/FTP_server

bin/FTP_client:  bin/main_client.o  bin/wrapsock.o
    gcc -o bin/FTP_client bin/main_client.o bin/wrapsock.o -lpthread -g

bin/FTP_server:  bin/main_server.o  bin/wrapsock.o
    gcc -o bin/FTP_server  bin/main_server.o  bin/wrapsock.o -lpthread -g

bin/main_client.o: src/main_client.c
    gcc -c src/main_client.c -g -o bin/main_client.o

bin/wrapsock.o: src/wrapsock.c src/wrapsock.h
    gcc -c src/wrapsock.c -g -o bin/wrapsock.o

bin/main_server.o: src/main_server.c
    gcc -c src/main_server.c -g -o bin/main_server.o

clean:
    rm ./bin/*.o
    rm ./bin/FTP_client
    rm ./bin/FTP_server

答案 1 :(得分:2)

不确定为什么将二进制对象移动到bin/,但是在构建客户目标之后,wrapsock.o不再位于项目根目录中,而是位于bin/中,因此当服务器目标轮到它时,gcc不再能够找到它。我只想放弃这些动作,或者如果有执行它们的理由,那就在一个单独的目标中这样做,只有在两个二进制文件都构建好之后(即将它们列为先决条件)才能完成。