c++ - arm-none-eabi-gcc 在 C 中使用 C++ 代码:未定义的引用
问题描述
我需要在我的 C 程序中使用一些 C++ 代码,这些代码必须与 arm-none-eabi 工具链交叉编译。我首先尝试以下简单程序:
主程序
#include "misc.h"
int main(){
say_hello();
return 0;
}
杂项
#ifndef _MISC_H_
#define _MISC_H_
/**
* \brief Prints hello to stdout
*/
void say_hello();
#endif /* _MISC_H_ */
杂项
/* 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();
}
}
生成文件
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
我在这里想念什么?
解决方案
您正在与 链接CC
,您必须与CXX
- 它不仅是 ,而且您不应将每行参数添加到CFLAGS
, CXXFLAGS
。
hello_world_mix: misc.o main.o
$(CXX) $(CFLAGS) $^ -o $@
main.o: main.c
$(CC) -c $(CFLAGS) $^ -o $@
misc.o: misc.cpp
$(CXX) -c $(CXXFLAGS) $^ -o $@
clean:
rm -f *.o
rm -f *~
原因很-l
可能是选项的顺序在某些GCC 版本中可能很重要,而在其他版本中则不重要。- 但让 g++ 担心这一点更容易。
推荐阅读
- security - getDeviceId:用户 10214 不符合获取设备标识符的要求
- linux - 使用 bash 脚本删除重复文件
- md5 - 如果字符串长度相等,则 sha & md5 冲突
- hyperledger-fabric - 当管理员证书即将过期时,如何为 Hyperledger Fabric 订购者/对等方续订管理员证书
- python - 如何在python中将分钟增加到当前时间
- javascript - 如何在不单击按钮的情况下在 React useEffect 中调用 Auth0 loginWithRedirect 函数?
- web-scraping - parsehub youtube 变灰了
- java - 使用 yum 或 wget 在 Linux(Azure) 上安装 OpenJDK 11
- python-3.x - 如何从 statsmodels AutoRegResults 中获取残差?model.resid 返回所有 NaN
- amazon-web-services - 无法从 terraform 数据源解析 cidr_block