我遇到了细分错误,但我不明白为什么。我留下了一堆东西(希望没什么重要的)。有趣的是,它运行良好,0错误,valgrind完全泄漏检查。这里是所有信息(我正在使用我在网上找到的代码处理随机数生成器):
file1.h
#ifdef __cplusplus
extern "C" {
#endif
#define STATE_N (19937 / 128 + 1)
union W128_T {
uint32_t u[4];
uint64_t u64[2];
};
typedef union W128_T w128_t;
struct STATE_T {
w128_t state[STATE_N];
int index;
};
typedef struct STATE_T state_t;
#ifdef __cplusplus
}
#endif
使用以下命令将其编译为静态lib:
gcc -c -O3 -finline-functions -fomit-frame-pointer -DNDEBUG -fno-strict-aliasing --param max-inline-insns-single=1800 -fPIC -Wmissing-prototypes -Wall -std=c99 src/file1.c -o obj/file1.o
ar rc lib/librand.a obj/file1.o
file2.h
#include "../rand/include/file1.h"
#ifdef __cplusplus
extern "C" {
#endif
state_t * rstate(void);
#ifdef __cplusplus
};
#endif
file2.cpp
#include "file2.h"
static state_t rngState;
state_t * rstate(void) {
return &rngState;
}
使用以下命令将文件2编译成静态库(省略一些内容)(来自cmake,运行make VERBOSE = 1:
/usr/bin/c++ -I/home/random/File1include -I/home/file2include -o CMakeFiles/file2Lib.dir/src/file2.o -c /home/src/file2.cpp
然后我在这个小测试程序test.cpp中测试了所有内容:
#include "file2.h"
#include <cstring>
int main(void)
{
state_t * state = rstate();
state_t save;
memcpy(&save, state, sizeof(save)); //segmentation fault
}
我使用以下命令构建(省略的东西):
g++ -I/home/random/File1include -I/home/file2include -L/home/file2Lib.dir -Wall -g test.o test.cpp
g++ -I/home/random/File1include -I/home/file2include -L/home/file2Lib.dir -Wall -g test.o -lfile2Lib -o randomTest
如果我将test.cpp改为此,它可以正常工作:
#include "file2.h"
#include <cstring>
int main(void)
{
state_t * state = new state_t();
state = rstate();
state_t save;
memcpy(&save, state, sizeof(save));
}
如果我单独离开test.cpp并将file2.h更改为:
#include "../rand/include/file1.h"
#ifdef __cplusplus
extern "C" {
#endif
state_t * rstate(void);
state_t rngState;
#ifdef __cplusplus
};
#endif
将file2.cpp更改为:
#include "file2.h"
state_t * rstate(void) {
return &rngState;
}
该程序也正常运行。最后,如果我将file2.h更改为:
#include "../rand/include/file1.h"
#ifdef __cplusplus
extern "C" {
#endif
state_t * rstate(void);
extern state_t rngState;
#ifdef __cplusplus
};
#endif
和file2.cpp:
#include "file2.h"
state_t rngState;
state_t * rstate(void) {
return &rngState;
}
它在测试程序中也有一个seg错误。
此外,seg错误发生在位置state->state[34]
。当我尝试打印state->state[34].u[0]
时,例如。
这里有什么想法吗?