我正在跑步RHEL 5.1
和使用gcc
.
我如何告诉cmake
添加-pthread
到编译和链接?
我想我理解该选项的正式含义.在我正在处理的一些遗留代码中,使用了该选项.客户抱怨RST作为对其接近的连接的FIN的回应.
我不确定我是否可以安全地将其删除,因为我不明白何时应该使用它.
能否举例说明何时需要该选项?
我想在C++中定义一个常量,以便在几个源文件中可见.我可以想象以下方法在头文件中定义它:
#define GLOBAL_CONST_VAR 0xFF
int GLOBAL_CONST_VAR = 0xFF;
int get_GLOBAL_CONST_VAR()
)enum { GLOBAL_CONST_VAR = 0xFF; }
const int GLOBAL_CONST_VAR = 0xFF;
extern const int GLOBAL_CONST_VAR;
并在一个源文件中 const int GLOBAL_CONST_VAR = 0xFF;
选项(1) - 绝对不是您想要使用的选项
选项(2) - 使用头文件在每个目标文件中定义变量的实例
选项(3) - 在大多数情况下,IMO过度杀戮
选项(4) - 在许多情况下可能不好,因为枚举没有具体类型(C++ 0X将增加定义类型的可能性)
所以在大多数情况下我需要在(5)和(6)之间进行选择.我的问题:
我正在尝试定义基类,它只包含typedef.
template<typename T>
class A
{
public:
typedef std::vector<T> Vec_t;
};
template<typename T>
class B : public A<T>
{
private:
Vec_t v; // fails - Vec_t is not recognized
};
Run Code Online (Sandbox Code Playgroud)
BI中为什么会收到Vec_t无法识别的错误,我需要明确写出来?
typename A<T>::Vec_t v;
Run Code Online (Sandbox Code Playgroud) 我们在专有的assert
宏中使用堆栈跟踪来捕获开发人员的错误 - 当捕获错误时,打印堆栈跟踪.
我发现gcc的配对backtrace()
/ backtrace_symbols()
方法不足:
第一个问题可以通过abi :: __ cxa_demangle来解决.
然而,第二个问题更加艰难.我发现了替换backtrace_symbols().这比gcc的backtrace_symbols()更好,因为它可以检索行号(如果使用-g编译),并且不需要使用-rdynamic进行编译.
Hoverer代码是GNU许可的,所以恕我直言我不能在商业代码中使用它.
任何建议?
PS
gdb能够打印传递给函数的参数.可能已经要求太多了:)
PS 2
类似的问题(感谢nobar)
我正在为我们的产品构建基于cmake的构建系统.问题是由cmake生成的Visual Studio项目不会在解决方案浏览器中显示头文件.
我需要在CMakeList.txt中添加什么来列出头文件?首选解决方案是不需要列出每个特定的头文件.
解决方案 这是我带来的解决方案:
file(GLOB_RECURSE INCS "*.h")
add_library(myLib ${SRCS} ${INCS})
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个基于Visual Studio C++的程序,它使用预编译的头文件(stdafx.h
).现在我们使用gcc 4.x将应用程序移植到Linux.
问题是如何在两种环境中处理预编译的头文件.我用Google搜索但无法得出结论.
显然,我希望stdafx.h
在Visual Studio中保留,因为代码库非常大,预编译的头文件可以增加编译时间.
但问题是在Linux中该怎么做.这是我发现的:
stdafx.h
原样.gcc比VC++编译代码要快得多(或者只是我的Linux机器更强...... :)),所以我对这个选项很满意.从这里使用方法- stdafx.h
看起来像(USE_PRECOMPILED_HEADER
仅为VS 设置):
#ifdef USE_PRECOMPILED_HEADER
... my stuff
#endif
Run Code Online (Sandbox Code Playgroud)使用此处的方法- 编译VC++ /FI
以隐式包含stdafx.h
在每个cpp文件中.因此,在VS中,您的代码可以轻松切换,无需预编译头文件即可编译,无需更改代码.
我个人不喜欢依赖,而这个混乱stdafx.h
正在推动一个庞大的代码库.因此,该选项对我很有吸引力 - 在你没有的Linux上stdafx.h
,同时仍然/FI
只能在VS上打开预编译的头文件.
stdafx.h
只作为预编译头(模仿Visual Studio)你的意见?还有其他方法可以解决这个问题吗?
搜索过,但没有遇到令人满意的答案.
我知道没有一种可移植的方式来打印pthread_t.
你是如何在你的应用程序中做到的?
更新:
其实我不需要pthread_t,而是一些小的数字id,在调试消息中识别不同的线程.
在我的系统(64位RHEL 5.3)上,它被定义为unsigned long int,因此它是大数字,只是打印它在调试行中占有一席之地.gdb如何分配短时间?
c++ ×8
cmake ×2
gcc ×2
linux ×2
pthreads ×2
auto-ptr ×1
c ×1
inheritance ×1
name-lookup ×1
networking ×1
pointers ×1
setsockopt ×1
so-linger ×1
sockets ×1
stack-trace ×1
standards ×1
stdafx.h ×1
tcp ×1
templates ×1
typedef ×1
types ×1
unique-ptr ×1