Articles of g ++

棘手的未定义的参考错误

在使用C ++在Linux中构build模块时遇到了一个棘手的“未定义引用”错误。 我将在高层描述它,并在必要时发布代码(这是专有的,所以发布它需要更改一些名称)。 一些细节: 模块A(一个库)有一个类,我们将称之为Bar的方法称为Foo。 模块A构build得很好,使用nm来查看目标文件显示构造函数和Bar都被定义(它们显示为“T”)。 模块B(一个库)包含一个使用模块A的类,引用了Foo :: Foo,Foo ::〜Foo和Foo :: Bar。 它的makefile包括-L / path / to / Foo和-lFoo。 这个模块也构build得很好。 但是,当我在模块B的目标文件上运行nm时,对模块Foo :: Foo,Foo ::〜Foo和Foo :: Bar的调用未定义(它们显示为“U”)。 为什么它构build超越了我。 模块C–其输出是一个可执行文件 – 包含对模块B的引用。当我尝试构build模块C时,它向我叫喊从模块B到模块A的Foo和Bar方法的未定义引用。 为什么模块B构build如果引用是不确定的? 为什么错误只有在我们进入模块C时才报告? 编辑: 我应该提到模块C的makefile也有-L / path / to / Foo和-lFoo,但仍然失败。 任何我应该尝试的任何高级猜测? 我有一种感觉,我将不得不张贴一些代码…

静态链接NCurses给出错误,用于BusyBox环境

我写了一个非常简单的ncurses程序在BusyBox环境下运行。 但是,似乎我无法让我的程序编译一切。 我用了: g++ menu.cpp -ohello -lncurses –> Works fine g++ -static menu.cpp -ohello -lncurses –> Undefined reference to SP (many times) 我发现这个问题,但它忽略了与ncurses的链接。 我需要一个非常可执行的文件 我的目标环境是固定的,所以我不关心可移植性。

析构函数称为窗体不适当的库

代码如下: foo.h中 extern "C" { int sdq_init_connector(const SSchar* path); } foo.cxx int sdq_init_connector(const SSchar* path) { Logger log(LOG_DEBUG, "sdq_init_connector"); /* here goes some not so relevant code */ log.write("Here be dragons"); return 0; } 还有Logger类,在foo中使用,没有什么有趣的,构造函数(char *消息),析构函数()和写(char *消息)。 问题总结: 当我从testing设备调用libfoo.so时,它完美地工作,但是在函数sdq_init_connector返回之后从生产系统调用它时SEGFAULTs backtrace在下面 #10 <signal handler called> #11 0x583d7fee in Node::~Node() () from /opt/siebel/sba81/siebsrvr/mw/lib/libtl.so #12 0x583de09a in Logger::~Logger() […]

SQLite错过了文字检索的字符

我正在将应用程序从Windows移植到Linux。 我已经设法使所有的工作,因为它应该,除了数据库。 每当我调用sqlite3_column_text16() ,我得到一个string是缺less大多数字符。 我不知道这种行为源于Windows,它无可挑剔的工作。 我没什么特别的,只是 wstring a(static_cast<wchar_t const *>(sqlite3_column_text16(stmt, 2))); 谢谢。

Linux共享库中全局variables的单个拷贝

这个问题与这个问题非常相似,但是没有提到的解决scheme是有帮助的。 假设我有一个使用本地全局variables的函数的共享库B. 这个函数是从第二个共享库C中调用的 B和C都被A使用,我期望每个都有它自己的全局variables实例,但不知何故,编译器设法将它们链接到指向相同的对象(与Windows不同)。 有人可以提出一种方法,让我有不同的全球变数的实例在A? 以下是我的代码。 运行a.out时,我希望得到 1 calling from someCFunc(): 1 但是,我得到: 1 calling from someCFunc(): 2 BH: #ifndef _B_H_ #define _B_H_ extern "C" __attribute__ ((visibility("default"))) void myFunc(); #endif b.cpp: #include "bh" #include <iostream> int myGlobal = 0; extern "C" __attribute__ ((visibility("default"))) void myFunc() { ++myGlobal; std::cout << myGlobal << "\r\n"; } CH: #ifndef […]

GLM和primefacesg ++ 4.8

我前几天从Windows切换到Linux,并且非常喜欢它。 不幸的是我有移植我的项目的问题。 在那里,我使用GLM进行向量计算和primefaces一起。 一切工作正常在Visual Studio上。 我遇到的第一个问题是,出于某种原因,只要包含atomic头,g ++ 4.6就给了我一个undefined referece to 。 然后我切换到g ++ 4.8,问题就没有了。 但是现在,只要我使用一个像这样的向量的primefaces: atomic<vec3> ,我就会遇到一个新的问题。 这就是g ++所说的: /usr/include/c++/4.8/atomic|167|error: function 'std::atomic<_Tp>::atomic() [with _Tp = glm::detail::tvec3<float>]' defaulted on its first declaration with an exception-specification that differs from the implicit declaration 'std::atomic<glm::detail::tvec3<float> >::atomic()'| 我不知道如何解决这个问题。 我想尝试g ++ 4.9,但我甚至不知道如何得到这个。 这是一个简单的代码,在我的机器上崩溃: #include <iostream> #include <glm.hpp> #include <atomic> using namespace […]

确定用于在* ix操作系统上构build共享对象的编译器和版本

我在一些加载一组用户指定的共享对象的软件上工作。 我想添加一些代码到我们的“加载器”组件,可以查询每个指定的共享对象,并找出什么编译器和编译器版本是用来build立/链接共享对象。 在过去,我已经能够使用“strings -a | grep”方法,如下所示。 但是,这种方法对于在AIX上使用g ++ 4.8编译的代码不起作用,而且在x86 linux上使用g ++ 4.8编译的代码并不能很好地工作。 如果可能的话,我也希望能够find一些更简洁的方式来获取这些信息,而不是寻找string。 任何人都可以提供关于如何查询共享对象的build议编译器的名称,也是该编译器的版本的意见? 下面是我现在使用的一些示例命令和输出: 在x86 linux g ++ 4.1编译的共享对象上: $ strings -a libshareme.so | grep GNU GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-50) <etc> (这里有很多重复的输出,但是很明显,版本是GCC 4.1.2) 上一个AIX xlC v11编译的对象 $ strings -a libshareme.so | grep XL XL IBM XL C/C++ for AIX, Version 11.1.0.6 […]

共享库和libpthread.so的g ++问题

我遇到了这个问题,希望能在这里find一些帮助。 我创build了一个小的示例可执行文件和共享库,展示了这个问题。 对不起,我意识到这已经变成了一面墙,但我试图确保包括所有的相关信息。 我的设置 System: CentOS release 5.11 (Final) g++: gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC) libc.so.6: Compiled by GNU CC version 4.1.2 20080704 (Red Hat 4.1.2-55). 我也在Redhat 6.6机器上尝试过,结果相似。 我的场景: 我有一个应用程序试图通过:: dlopen()在运行时加载共享库。 如果我没有在pthread中链接,那么它似乎工作,但最终会崩溃在共享库试图抛出一个exception。 这样做的原因是系统运行时库的构build期望线程本地存储(TLS),exception处理使用TLS中的数据结构,但在这种情况下它是NULL,并导致崩溃。 函数是__cxa_allocate_exception和__cxa_get_globals,看起来他们正在使用libc中的存根函数,因为pthread没有链接到。 我现在遇到的问题是试图链接到pthread来纠正上面提到的问题。 如果我用pthreads构build,应用程序段错误尝试加载libpthread.so.0作为我的共享库的依赖项。 我读过的关于这个崩溃的一切是,应用程序是在没有pthread的情况下构build的,而共享库是用pthread构build的。 不过,我用pthreads来构build二进制文件,但是我仍然遇到这个问题。 示例代码: 共享库文件(foo。*) foo.h中 #pragma once extern "C" { extern void DoWork(); } Foo.cpp中 #include […]

在Linux中关于FD_SET和fd_set

我的操作系统是64位Centos6.4。 我有一个关于如何fd_setpipe理FD_SET的问题添加fd.Follow代码是这样的: fd_set my_set; FD_SET(31, &my_set); 然后,我显示my_set.fds_bits […]。my_set.fds_bits [0]等于0x0000000080000000,my_set.fds_bits [1〜…]为零。我可以理解结果。但是我也写一个case ,关注代码: fd_set my_set; FD_SET(63, &my_set); 我显示my_set.fds_bits […]。my_set.fds_bits [0]等于0x0。在我看来,结果应该是my_set.fds_bits [0]等于0x8000000000000000.我真的不明白为什么第二结果是0x0。 不是等于63的fd在my_set中有一个状态。 这里是完整的testing代码: #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <resolv.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <fcntl.h> #include <sys/time.h> #include <pthread.h> #define BUFSIZE 1024 void printFDSET(fd_set target_sets) { int uIndex = […]

将Linux上的静态英特尔IPP库与g ++相关联的问题

我一直在试图将一个项目从Xcode移到Linux(现在是Ubuntu x86,但是希望静态链接的可执行文件可以在x86 CentOS机器上运行?我希望我希望?)。 我有整个项目编译,但它在链接阶段失败 – 它给我所有由IPP定义的函数的未定义的引用。 这可能是一个非常小而愚蠢的事情,但是现在我已经打了几天头了,而我却无法完成它的工作。 这里是编译语句(我也有一个生成相同的错误的生成文件): g ++ -static /opt/intel/ipp/6.0.1.071/ia32/lib/libippiemerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippimerged.a /opt/intel/ipp/6.0.1.071/ ia32 / lib / libippsemerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippsmerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippcore.a -pthread -I / opt / intel / ipp / 6.0.1.071 / ia32 / include -I tools / include -o main main.cpp pick_peak.cpp get_starting_segments.cpp get_segment_timing_differences.cpp recast_and_normalize_wave_file.cpp rhythm_score.cpp pitch_score.cpp pitch_curve.cpp tools / source / LocalBuffer.cpp tools […]