我制作了一个处理 c 字符串的库。
我已将其添加到另一个项目 CMakeLists 中。问题是,每当我想从该库中调用一个函数时,它就会崩溃。
但是,如果我从库本身调用相同的函数,没有崩溃,函数调用会得到正确处理。
我一直在想我的 CMakeLists 做错了什么,但据我所知,以及我用来得出相同结论的不同方法,它看起来不再像它了。
我尝试在 gdb 中运行有问题的测试,这就是它返回的内容
Starting program: C:\Users\s\Documents\Repo\C\Projet\lib\rule\build\test-create-destroy.exe
gdb: unknown target exception 0xc0000135 at 0x7ffdfa70cf40
gdb: unknown target exception 0xc0000135 at 0x7ffdfa70cf40
Program received signal ?, Unknown signal.
0x00007ffdfa70cf40 in ntdll!RtlRaiseStatus () from C:\Windows\SYSTEM32\ntdll.dll
我已经读到这可能是与内存分配错误有关的问题,但如果是这种情况,为什么我可以直接从我的库中调用该函数而不会出现任何错误?
为了简单起见,这是在相关库中调用的函数:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct _String
{
unsigned int size;
char *string;
} String;
String *create_string(char *chr)
{
String *str = malloc(sizeof(String));
str->size = strlen(chr);
str->string = malloc(str->size + 1);
memcpy(str->string, chr, str->size);
str->string[str->size] = '\0';
return str;
}
void destroy_string(String *str)
{
free(str);
}
这里我调用的第二个库是一个函数,因为它是同一个项目的一部分:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string-struct.h>
typedef struct _rule
{
String *premise;
String *conclusion;
} rule;
rule *create_rule(String *premise, String *conclusion)
{
rule *r = calloc(1, 16);
r->premise = premise;
r->conclusion = conclusion;
return r;
}
void destroy_rule(rule *r)
{
free(r);
}
这是 Rulestruct 使用的 CMakeLists:
cmake_minimum_required(VERSION 3.0)
project("Rulestruct")
find_package(Stringstruct)
include_directories(${STRINGSTRUCT_INCLUDE_DIRS})
link_directories(${STRINGSTRUCT_LIB_DIRS})
add_library(rulestruct SHARED "${CMAKE_CURRENT_SOURCE_DIR}/src/rule-struct.c" "${CMAKE_CURRENT_SOURCE_DIR}/src/rule-struct.h")
target_link_libraries(rulestruct ${STRINGSTRUCT_LIBRARIES})
add_executable(test-create-destroy "${CMAKE_CURRENT_SOURCE_DIR}/src/test-create-destroy.c" "${CMAKE_CURRENT_SOURCE_DIR}/src/rule-struct.h")
add_dependencies(test-create-destroy rulestruct)
target_link_libraries(test-create-destroy rulestruct)
最后,这是我从 ( test-create-destroy.c
)调用函数的地方
#include <assert.h>
#include <string-struct.h>
#include "rule-struct.h"
#include "rules-struct.inc"
int main(void)
{
String *premise = create_string("1 2"); // location of crash
String *conclusion = create_string("3"); // location of crash
/*rule *rule_A = create_rule(premise, conclusion);
assert(string_char_equal(rule_A->premise, "1 2"));
assert(!string_char_equal(rule_A->premise, "3"));
assert(string_char_equal(rule_A->conclusion, "3"));
assert(!string_char_equal(rule_A->conclusion, "1 2"));
destroy_rule(rule_A);*/
destroy_string(premise);
destroy_string(conclusion);
}
下面是 bin、lib 和 cmake-gui 的截图:https ://imgur.com/a/3OdrC2D
如果我知道我做错了什么以及为什么做错了,我可能可以在每个项目上修复它,所以如果有人可以提供进一步的解释,那么我很乐意阅读它。
我还将获取有关与我的 CMakeLists 相关的问题或潜在问题的提示,因为我很难理解其中任何一个,需要混合多个示例和文档以对为什么以这种或那种方式完成某事有一点了解.
TLDR:在库内部以外的其他地方调用的函数 = 崩溃,接受有关所呈现数据的其他部分的提示(CMakeLists)。很高兴接受对问题核心的进一步解释。