从其他C ++源调用函数不起作用

时间:2019-09-28 14:33:19

标签: c++ function makefile

在这里,我已经查看了几个相同问题的帖子,据我所知,我已经完成了他们所说的事情。但是,我仍然收到“对`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仍然会给我同样的错误。我真的不了解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 个答案:

答案 0 :(得分:2)

必须在makefile中的main:之后添加combin.o。

答案 1 :(得分:1)

由于使用的是库,因此需要告诉链接程序使用它(LDFLAGS),它应该在g ++命令中的main之后。如先前的注释所述,使用命名空间cmd需要更改为cmb

这个对我有用:

"test-one_thing"

我还需要添加./来过滤掉main.cc

示例运行:

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