arm-none-eabi-gcc с использованием кода C ++ в C: неопределенные ссылки - PullRequest
0 голосов
/ 14 декабря 2018

Мне нужно использовать некоторый код C ++ в моей C-программе, который должен быть скомпилирован с помощью набора инструментов arm-none-eabi.Сначала я пробую следующую простую программу:

main.c

#include "misc.h"

int main(){
    say_hello();
    return 0;
}

misc.h

#ifndef _MISC_H_
#define _MISC_H_

/**
 * \brief Prints hello to stdout
 */
void say_hello();

#endif /* _MISC_H_ */

misc.c

/* C++ implementation */
#include <iostream>

using namespace std;

void cpp_say_hello(){
    cout << "Hello world!" << endl;
}

/* C wrapper */
extern "C"{
    #include "misc.h"

    void say_hello(){
        cpp_say_hello();
    }
}

Makefile

CFLAGS += -lstdc++
CXXFLAGS += -c

hello_world_mix: misc.o main.c
    $(CC) $(CFLAGS) $^ -o $@

misc.o: misc.cpp
    $(CXX) $(CXXFLAGS) $^ -o $@

clean:
    rm -f *.o
    rm -f *~

Когда я компилирую его изначально (просто выполняя команду 'make'), он работает просто отлично.Но если я попытаюсь сделать кросс-компиляцию с помощью:

CC=arm-none-eabi-gcc CXX=arm-none-eabi-g++ CFLAGS=--specs=nosys.specs make

Это неопределенные ссылки, которые я получаю:

arm-none-eabi-gcc --specs=nosys.specs -lstdc++ misc.o main.c -o hello_world_mix
/usr/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: misc.o: in function `cpp_say_hello()':
misc.cpp:(.text+0x34): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/usr/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: misc.cpp:(.text+0x44): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/usr/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: misc.cpp:(.text+0x5c): undefined reference to `std::cout'
/usr/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: misc.cpp:(.text+0x60): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
/usr/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: misc.o: in function `__static_initialization_and_destruction_0(int, int)':
misc.cpp:(.text+0xb4): undefined reference to `std::ios_base::Init::Init()'
/usr/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: misc.cpp:(.text+0xe4): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
make: *** [Makefile:5: hello_world_mix] Error 1

Чего мне здесь не хватает?

1 Ответ

0 голосов
/ 14 декабря 2018

Вы связываете с CC, вы должны связать с CXX - это не только. Также вы не должны добавлять аргументы для каждой строки в CFLAGS, CXXFLAGS.

* 1006.*

Причиной может быть то, что упорядочение опций -l может быть значительным в в некоторых версиях GCC, а не в других. - но это прощепозволить g ++ беспокоиться об этом.

...