Вызов функции из другого источника C ++ не работает - PullRequest
0 голосов
/ 28 сентября 2019

Я просмотрел несколько постов с одинаковыми вопросами здесь, и, насколько я понял, я сделал то, что они сказали сделать.Тем не менее, я все еще получаю предупреждение «неопределенная ссылка на cmb :: functionA ()».

У меня есть заголовок:

//combine.h
#ifndef COMBINE_H
#define COMBINE_H

namespace cmb 
{
    void functionA();
}

#endif

Исходный файл функции:

// combine.cc
#include <iostream>
#include "combine.h"
using namespace std;

namespace cmb
{
    void functionA()
    {
        cout << "print something\n"; 
    }
}

И основной:

//main.cc
#include "combine.h"
using namespace std;
using namespace cmd;

int main(int argc, char *argv[])            
{   
    functionA();
}

Теперь он работает, когдаКомпиляция вручную (g ++ -o Test * .cc -Wall --std = c ++ 17), но использование make все равно выдает мне ту же ошибку.Я действительно не понимаю, создавать файлы, поэтому любая помощь будет оценена.

makefile:

CXX := g++
CXXFLAGS += -Wall -std=c++17

LIBSRCS = $(filter-out main.cc,$(shell find -name \*.cc))
LIBOBJS = $(patsubst %.cc,%.o,$(LIBSRCS))

main: main.o combine.o libproject.a
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $<

$(LIBOBJS): %.o: %.cc
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<

libproject.a: $(LIBOBJS)
    ar rcs $@ $^
clean:
    rm -f libproject.a $(LIBOBJS)
.PHONY: clean

Я просто использую make main в терминале.

Ответы [ 2 ]

2 голосов
/ 28 сентября 2019

Вы должны добавить объединить. После основного: в make-файле.

1 голос
/ 28 сентября 2019

Поскольку вы используете библиотеку, вы должны указать компоновщику, чтобы она использовалась (LDFLAGS), и она должна быть после основной в команде g ++.Как и в предыдущих комментариях, использование cmd пространства имен нужно было изменить на cmb

. Это мне помогло:

CXX := g++
CXXFLAGS += -Wall -std=c++17

LIBSRCS = $(filter-out ./main.cc,$(shell find -name \*.cc))
LIBOBJS = $(patsubst %.cc,%.o,$(LIBSRCS))
LDFLAGS += -L. -lproject

main: main.o libproject.a
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ $< $(LDFLAGS) 

libproject.a: $(LIBOBJS)
    ar rcs $@ $^

.PHONY: clean
clean:
    rm -f libproject.a $(LIBOBJS) main main.o

Мне также нужно было добавить ./ при фильтрации main.cc

Пример выполнения:

jontte@jontte-Latitude-E5420:~/Temp/maketest$ make
g++ -Wall -std=c++17   -c -o main.o main.cc
g++ -Wall -std=c++17   -c -o combine.o combine.cc
ar rcs libproject.a combine.o
g++  -Wall -std=c++17 -o main main.o -L. -lproject 
jontte@jontte-Latitude-E5420:~/Temp/maketest$ ./main 
print something
jontte@jontte-Latitude-E5420:~/Temp/maketest$ make clean
rm -f libproject.a ./combine.o main main.o
jontte@jontte-Latitude-E5420:~/Temp/maketest$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...