Cześć.
Pierwszy raz w życiu korzystam z Makefile. Tutaj jak on wygląda:
CC = g++
WRGS = -Wall -Wextra -Wunused -Wmisleading-indentation -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wuseless-cast
CSTD = c++17
BOOST_INC = D:\Private\Boost\boost\include\boost-1_70
BOOST_LIB = D:\Private\Boost\boost\lib
all: others.o parser.o parser_test.o
$(CC) -std=$(CSTD) $(WRGS) others.o parser.o parser_test.o -o parser
parser_test.o:
$(CC) -std=$(CSTD) $(WRGS) parser_test.cpp -c -o parser_test.o -isystem$(BOOST_INC) -L$(BOOST_LIB) -lboost_filesystem
parser.o:
$(CC) -std=$(CSTD) $(WRGS) parser/parser.cpp -c -o parser.o
others.o:
$(CC) -std=$(CSTD) $(WRGS) others/others.cpp -c -o others.o
clean:
del *.o
tutaj struktura plików:
D:.
│ args.h
│ file_struct
│ Makefile
│ parser_test.cpp
│
├───.vscode
│...
│
├───others
│ others.cpp
│ others.h
│ others.h.gch
│
└───parser
parser.cpp
parser.h
parser.h.gch
parser.cpp includuje others.h,
parser_test.cpp includuje parser.h
args.h includuje others.h
tutaj deklaracja i definicja parser::parser():
#include <string_view>
#ifndef PARSER_H
#define PARSER_H
namespace parser{
...
bool parse(std::string_view);
...
}
#endif
#include "parser.h"
#include "../others/others.h"
#include <iostream>
#include <fstream>
...
bool parser::parse(std::string_view file_path){
auto ret = getEnvVar(file_path);
std::cout<< (ret==std::string_view() ? "NULL" : file_path);
return true;
}
make wywala mi:
parser_test.o:parser_test.cpp:(.text+0x1d8): undefined reference to `parser::parse(std::basic_string_view<char, std::char_traits<char> >)'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:8: all] Error 1
i nie wiem o co może chodzi, skoro wszystko wydaje się linkować poprawnie. Kiedy osobno kompiluję jakiś plik cpp używający parser::parse z parser/parser.cpp i others/others.cpp, to wszystko działa.
Prosiłbym o pomoc.