为什么我的外部变量未初始化?

时间:2016-12-07 00:52:09

标签: c gcc

我在共享库中使用以下模式:

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)

0 个答案:

没有答案