所以我一直在32位编码,昨天我需要构建一个DLL,我有几个问题.无论如何我在这里解决了他们.
不幸的是,即使我认为一切工作毕竟我发现,情况并非如此,当我提出我的程序和其他计算机上生成文件是什么在64位上运行,你可以猜到发生了什么事?
所以我的问题与64位的重定位有关
/usr/bin/ld: MyClass.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
MyClass.o: could not read symbols: Bad value
Run Code Online (Sandbox Code Playgroud)
这是我的makefile
MyProgram: main.o chkopts
-${CLINKER} -o $@ $< ${MYLIB} ${PETSC_MAT_LIB}
${RM} main.o
export LD_LIBRARY_PATH=${LIBADD}:$LD_LIBRARY_PATH
LibMyProgram.so: MyClass.o chkopts
-${CLINKER} -shared -Wl,-soname,${SONAME} -o ${VERS} *.o ${PETSC_MAT_LIB}
mv ${VERS} ${LIBADD}
ln -sf ${LIBADD}${VERS} ${LIBADD}${SOWOV}
ln -sf ${LIBADD}${VERS} ${LIBADD}${SONAME}
Run Code Online (Sandbox Code Playgroud)
我试图在CFLAGS,CPPFLAGS甚至LDFLAGS中添加-fPIC.我也尝试在-shared标志之前和之后添加-fPIC.
-${CLINKER} -shared -fPIC -Wl,-soname,${SONAME} -o ${VERS} *.o ${PETSC_MAT_LIB}
Run Code Online (Sandbox Code Playgroud)
但我会像以前一样得到同样的错误.
如果我使用CFLAGS = -fPIC,我会得到一点同样的错误:
.../petsc/petsc-3.2-p6/arch-linux2-cxx-debug/lib/libpetsc.a(err.o): relocation …Run Code Online (Sandbox Code Playgroud) 如何为netbeans C++项目指定命令行参数?
调试选项卡上似乎没有合适的位置.
我是第一次在STL库中使用vector类.我应该如何添加到矢量数组的特定行?
struct x{
vector <vector <int> > v;
int row;
};
vector< int* > my ints;
int add;
Run Code Online (Sandbox Code Playgroud)
如果我想用第一个整数指针添加到第一行v,我能做到吗?
myints[0]->v[myints[0]->row].push_back(add);
Run Code Online (Sandbox Code Playgroud)
这种方法是否可以创建向量ints的二维向量,其中每一行可能具有不同的长度(即具有不同的列数)?
好吧,因此在GTK +版本0.60之后,设计人员意识到,为了将来的开发和进步,整个工具包需要被重写为面向对象.
现在,由于C不支持OOP,为了提供面向对象和继承heiriearchies,他们创建了GObject系统.现在创建GObject系统必须具有所需的开发时间,更多依赖性,更多问题,但他们必须创建它以向C编程语言提供面向对象的功能.但在那个时候,有是提供另一种解决方案恰好的是,C++!
为什么GTK +的开发人员只使用C++?
我的意思是,为什么浪费时间创建整个库而不是使用许多项目采用的经过时间考验的解决方案?不要误会我的意思,我不是想把这篇文章变成C vs C++的东西(我在论坛上已经有足够的了,谢谢你).我只是想知道让GTK +的设计师做出决定的原因和问题.
如果我有两个向量并想将它们组合成一个,我可以通过以下方式实现:
std::vector<T> a(100); // just some random size here
std::vector<T> b(100);
a.insert(std::end(a), std::begin(b), std::end(b));
Run Code Online (Sandbox Code Playgroud)
这涉及复制,但我想避免.有没有办法使用move-semantics将它们组合在一起?
我非常怀疑它,因为vector它应该是连续的.但是有什么方法可以做到deque吗?
据我所知的数据类型,在声明变量时,我们需要声明其数据类型,它告诉编译器相应地保留内存中的字节数.
但是在指针的情况下,我们知道它们的大小总是2个字节(在Turbo编译器中)总是与它所指向的变量的数据类型无关.
我的问题是,如果指针总是占用2个字节,那么在声明它们时需要提一下数据类型吗?或者我对指针的理解是错误的?
我假设这只返回一个int.还有什么事情我应该知道吗?C/C++的差异?
float a = 2.5;
!a; // What does this return? Int? Float?
Run Code Online (Sandbox Code Playgroud) boost::thread_groupC++ 11中有什么类似的东西吗?
我只是试图将我的程序从使用移植boost:thread到C++ 11线程,并且无法找到任何等效的东西.
所以,今天我很无聊,并决定搞乱C++/Obj-C插值,我找到了一种方法来创建一个非常有趣的设置.
@protocol NSCPPObj <NSObject>
-(id) init;
-(id) initWithInt:(int) value;
-(int) somethingThatReturnsAValue;
-(void) doSomething;
@end
class NSCPPObj : objc_object {
public:
static Class cls();
int iVar;
NSCPPObj();
NSCPPObj(int);
int somethingThatReturnsAValue();
void doSomething();
};
Run Code Online (Sandbox Code Playgroud)
如您所见,界面非常简单易懂.我们创建两个(几乎)相同的接口,一个用于C++对象,另一个用于Obj-C协议.
现在,我找到了一种方法来实现这一点,但是让自己好斗,这变得丑陋:
// NSCPPObj.mm
#import <objc/runtime.h>
#import <iostream>
#import "NSCPPObject.h"
Class NSCPPObj_class = nil;
__attribute__((constructor))
static void initialize()
{
NSCPPObj_class = objc_allocateClassPair([NSObject class], "NSCPPObj", 0);
class_addMethod(NSCPPObj_class->isa, @selector(alloc), imp_implementationWithBlock(^(id self) {
return class_createInstance(NSCPPObj_class, sizeof(struct NSCPPObj));
}), "@@:");
class_addMethod(NSCPPObj_class, @selector(init), imp_implementationWithBlock(^(id self) {
return self;
}), "@@:");
class_addMethod(NSCPPObj_class, @selector(initWithInt:), imp_implementationWithBlock(^(id …Run Code Online (Sandbox Code Playgroud) 我在Eclipse中混合了C++/Java项目.我已经设置了build.mk文件,当编辑器中的所有文件都关闭时,Eclipse会成功构建项目.当我打开.h或.cpp文件时,Eclipse会在其中找到许多未定义的符号.我引用了第三方API,所有问题似乎都与该API的符号有关.奇怪的是,某些类型被认为是在Eclipse中定义的,有些类型被认为是未定义的,即使在某些情况下它们是在同一个.h文件中定义的.
我的同事没有遇到任何这些问题,但我们无从何处开始解决这个问题.我们已经确保我们的Eclipse包含目录是相同的.有没有办法比较eclipse项目设置?
更新:.cproject目录中的.cproject文件和.project文件和文件只知道某些路径不同.虽然没有帮助解决我的问题.