我有两个makefile,用于本机和交叉编译.它们之间唯一的区别是编译器名称:
# makefile CC = g++ ...
# makefile-cc CC = arm-linux-gnueabihf-g++ ...
为了进行本机编译,我执行make,进行交叉编译,我执行make -f makefile-cc.我希望有一个makefile,应该使用make本机编译执行,并make cross进行交叉编译.这样做的正确语法是什么,例如:
# makefile (C-like pseudo-code)
if cross
CC = arm-linux-gnueabihf-g++
else
CC = g++
std::unique_ptr<int> ptr;
ptr = new int[3]; // error
Run Code Online (Sandbox Code Playgroud)
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int *' (or there is no acceptable conversion)
为什么这不编译?如何将本机指针附加到现有的unique_ptr实例?
我在Ubuntu 12.04上安装了gcc-arm-linux-gnueabihf交叉编译器,现在我可以为嵌入式设备构建一个程序.我在哪里可以找到交叉gdb进行调试?
gcc-arm-linux-gnueabihf引用包含相关包列表中的gdb-arm-linux-gnueabihf,它似乎是我正在寻找的调试器.但是这个套餐不可用.
码:
#include <iostream>
void out()
{
}
template<typename T, typename... Args>
void out(T value, Args... args)
{
std::cout << value;
out(args...);
}
int main()
{
out("12345", " ", 5, "\n"); // OK
out(std::endl); // compilation error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
构建错误:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -pthread -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
../main.cpp: In function ‘int main()’:
../main.cpp:17:15: error: no matching function for call to ‘out(<unresolved overloaded function type>)’
../main.cpp:17:15: note: candidates are:
../main.cpp:3:6: note: void out() …Run Code Online (Sandbox Code Playgroud) 观察我在Android模拟器中的应用程序行为,我发现在更改屏幕方向后会保留EditText内容(Ctrl + F11).但TextView内容重置为其初始值,并不保留程序设置的最新信息.根据定义,这种行为?我该怎么做才能保留这些内容?
我有静态EventHandler事件的类:
public static event EventHandler MyEvent;
static void RaiseEvent()
{
EventHandler p = MyEvent;
if (p != null)
{
p(null, EventArgs.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
由于我没有任何this可以用作事件发送者的对象,所以我提出了这个事件sender = null.根据.NET编程指南,将此参数设置为null是否可以?如果没有,我可以将哪个对象用作发件人?
Functions.h:
#pragma once
#include <iostream>
template<class T> void TemplatedFunction(T* p) {}
template<> void TemplatedFunction<float>(float* p) {}
template<> void TemplatedFunction<char>(char* p) {}
Run Code Online (Sandbox Code Playgroud)
Functions.cpp:
#include "Functions.h"
void Test()
{
TemplatedFunction<float>(NULL);
TemplatedFunction<char>(NULL);
}
Run Code Online (Sandbox Code Playgroud)
main.cpp中:
#include "Functions.h"
void Test();
int main()
{
Test();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
构建错误:
main.obj : error LNK2005: "void __cdecl TemplatedFunction<float>(float *)" (??$TemplatedFunction@M@@YAXPAM@Z) already defined in Functions.obj
main.obj : error LNK2005: "void __cdecl TemplatedFunction<char>(char *)" (??$TemplatedFunction@D@@YAXPAD@Z) already defined in Functions.obj
Run Code Online (Sandbox Code Playgroud)
我知道有两种解决方法:
不要将Functions.h包含在几个.cpp文件中 - 如果h文件包含许多.cpp文件中需要的一些其他定义,则不能在复杂项目中应用.
将所有模板化函数声明为static.但这意味着专用函数出现在包含Functions.h的所有.cpp文件中,即使它们未被使用,也可能导致代码重复.
所以,我看到专门的模板化函数表现得像非模板化函数.是否还有其他解决方案可以在没有static声明的情 如果声明了函数 …
我有以下程序:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
//ostringstream s;
cout << "cpp test" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用交叉编译器在 Ububtu 20.04 桌面上构建它:
arm-linux-gnueabihf-g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/cpp_test.d" -MT"src/cpp_test.o" -o "src/cpp_test.o" "../src/cpp_test.cpp"
arm-linux-gnueabihf-g++ -o "cpp_test" ./src/cpp_test.o
Run Code Online (Sandbox Code Playgroud)
然后我复制cpp_test到 BeagleBone Black Wireless 板并执行它:
debian@beaglebone:~/c$ ./cpp_test
cpp test
debian@beaglebone:~/c$ ldd cpp_test
linux-vdso.so.1 (0xbee85000)
libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0xb6ea1000)
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6e78000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6d7e000)
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6d03000)
/lib/ld-linux-armhf.so.3 (0xb6fbe000)
Run Code Online (Sandbox Code Playgroud)
现在我取消注释该行ostringstream s; …
我的最终目标是编写可以在Unix操作系统上运行的程序.我知道有很多Unix版本,现在还不知道我需要支持哪一个.我现在无法安装任何Unix操作系统.我唯一能做的就是尽可能使用接近Unix的免费操作系统.FreeBSD是一个不错的选择吗?我知道还有OpenBSD,可能还有别的东西.
附加信息:编程语言是C++,我使用的是GCC,还有一些可移植的库:Boost和wxWidgets.
我需要执行第三方开源程序,它抛出NetworkOnMainThreadException.根据SDK参考,仅针对Honeycomb SDK或更高版本的应用程序进行此操作.针对早期SDK版本的应用程序可以在其主要事件循环线程上进行联网.
在第一阶段,我只想运行程序,而不更改源.所以,我改变了AndroidManifesr.xml中的行:
android:targetSdkVersion="15"
至:
android:targetSdkVersion="10"
但是,这没有用,程序仍然会抛出NetworkOnMainThreadException.我怎样才能使这个工作?我正在尝试在Android Emulation Google API上执行该程序(级别16).