用于链接外部全局的 Makefile

Makefile for linking an extern global

我正在尝试使用在 struct.cpp 中定义并在 test.cpp 中的 struct.hpp 中声明的 g_struct 变量,但是 linking失败。这是为什么?

// test.cpp

#include "struct.hpp"

int main(void)
{
    g_struct.a = 1;
    return 0;
}

// struct.cpp

#include "struct.hpp"

Struct g_struct;
// struct.hpp

#pragma once

struct Struct {
    int a;
};

extern Struct g_struct;
# Makefile

CC = g++

all: struct.o test

test: test.cpp
    $(CC) -o test test.cpp

struct.o: struct.cpp
    $(CC) -c -o struct.o struct.cpp

.PHONY: clean

clean:
    rm -f *.o test

链接错误:

$ make
g++ -c -o struct.o struct.cpp
g++ -o test test.cpp
/tmp/ccgSoJhd.o: In function `main':
test.cpp:(.text+0xd): undefined reference to `g_struct'
collect2: error: ld returned 1 exit status
Makefile:6: recipe for target 'test' failed
make: *** [test] Error 1

如果我 link 没有 -c 标志,我得到:

$ make
g++ -o struct.o struct.cpp
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Makefile:9: recipe for target 'struct.o' failed
make: *** [struct.o] Error 1

你必须 link struct.o,其中有 Struct g_struct;.

test: test.cpp
    $(CC) -o test test.cpp struct.o