Why is the makefile returning g++: error: h file or directory make: *** [Makefile:12: test] Error 1?

Why is the makefile returning g++: error: h file or directory make: *** [Makefile:12: test] Error 1?

我要编译这个程序test.cpp

#include <iostream>
#include <cstring>
#include <iomanip>
#include <sodium.h>
#include <gmpxx.h>
#include <sstream>

using namespace std;

//Encryt or  decrypt with RSA
mpz_class RSA(mpz_class m, mpz_class e,mpz_class N)
{
mpz_class rop;
mpz_powm(rop.get_mpz_t(), m.get_mpz_t(), e.get_mpz_t(), N.get_mpz_t());
return rop;
}

int main(const int argc, const char *const argv[])
{
if (argc!=4){
printf("usage: %s [Message] [Exponent] [Modulus] \n", argv[0]);
    return 1;
    }

const mpz_class m(argv[1]), d(argv[2]),N(argv[3]);
cout<<endl<<RSA(m,d,N);

return 0;
}

用这个 makefile Makefile

CXX = g++
CXXFLAGS = -c -Wall -Wextra -Werror
LDFLAGS =  -lgmp -lsodium -lssl -lcrypto -lgmpxx
SRC = $(wildcard *.cpp )
HDR = $(wildcard *.h )
OBJ = $(SRC :.cpp =.o )
all : Release
Debug : CXXFLAGS +=-g
Debug : test
Release : test
test : $(OBJ)
    $(CXX) -o $@ $ˆ $(LDFLAGS)
%.o : %.cpp $(HDR)
    $(CXX) $(CXXFLAGS) $< -o $@
clean :
    rm -f $(OBJ) test

但是我收到了

-------------- Build: Debug in KA-RMP (compiler: GNU GCC Compiler)---------------

Checking if target is up-to-date: make -q -f Makefile Debug Running command: make -f Makefile Debug

g++: error: h file or directory

make: *** [Makefile:12: test] Error 1

g++ -o test lsodium -lssl -lcrypto -lgmpxx

Process terminated with status 2 (0 minute(s), 0 second(s)) 2 error(s), 0 warning(s) (0 minute(s), 0 second(s))

您知道我收到错误消息的原因吗?

问题是 $^ 和 $@ 没有按您预期的那样工作。 $@ 和 $^ return $OBJ 的左右值。但是 $OBJ 只是解析为 "test.o"。

OBJ = $(SRC:.cpp=.o) # converts test.cpp to test.o

因此 $^ 将 return 什么都没有,因为右边什么也没有。 如果要使用 $^,则必须将 OBJ 设置为 "test.o test.cpp"。我用你的 makefile 进行了更改。

否则使用 $(CXX) -o $@ $(SRC) $(LDFLAGS).

CXX = g++
CXXFLAGS = -c -Wall -Wextra -Werror
LDFLAGS =  -lgmp -lsodium -lssl -lcrypto -lgmpxx
SRC = $(wildcard *.cpp )
HDR = $(wildcard *.h )
OBJ = $(SRC) $(SRC :.cpp =.o )
all : Release
Debug : CXXFLAGS +=-g
Debug : test
Release : test
test : $(OBJ)
    $(CXX) -o $@ $^ $(LDFLAGS)
%.o : %.cpp $(HDR)
    $(CXX) $(CXXFLAGS) $< -o $@
clean :
    rm -f $(OBJ) test