我在共享库中使用以下模式:
extern int var;
...
int var = -1;
...
void _module_init(void) {
if (var < 0) {
... do initialization stuff ...
var = [some generated value > 0]
}
}
...
void module_api_function( ... parameters ... ) {
_module_init();
... stuff ...
}
这非常有效,直到我重新编写了一些cmake makefile(摆脱了静态库 - 我用来构建共享库和静态库)。由于某些原因,现在var
不再被初始化为-1
,但现在是0
。其他指针,extern
变量设置为NULL
。我的static
变量似乎初始化OK。为了使这更令人愤怒,我的一些共享库工作,而其他人则没有。并且linux / gcc 6.0.2不起作用,但Windows / MingW / gcc 4.x确实有效。
main
之前运行并且破坏了我的数据段。但这是C,所以我不知道那是什么。
我错过了什么? nm
/ readelf
/ objdump
系列中是否有工具不仅会向我显示导出符号的地址,还会显示其值? gcc 6.0中有什么东西让我沮丧吗?
混淆。
编辑:一些先发制人的评论:
var
是模块API的一部分。无法成功static
__attribute__((constructor))
,但我希望在某些时候保持我的选项可以移植到MSVC。也与手头的问题无关,编辑2 :CMakeLists.txt用于失败的lib,但其他的大致相同:
set(SOURCES
any.c
array.c
... about 20 more ...
)
# I ripped off the regex API from glibc for use on Windows.
if (NOT HAVE_REGEX_H)
set(SOURCES ${SOURCES} regex.c)
endif (NOT HAVE_REGEX_H)
add_library(oblcore SHARED ${SOURCES})
if (NOT HAVE_REGEX_H)
target_compile_definitions(oblcore PRIVATE BUILD_REGEX_DLL;HAVE_CONFIG_H)
endif (NOT HAVE_REGEX_H)
install(TARGETS oblcore
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib)
add_subdirectory(test)