c - 全局变量的多重定义

标签 c makefile shared-libraries

<分区>

Possible Duplicate:
constant variables not working in header

在我用来创建共享对象的头文件中,我有以下内容:

#ifndef LIB_HECA_DEF_H_
#define LIB_HECA_DEF_H_

struct dsm_config {
    int auto_unmap;
    int enable_copy_on_access;
};

enum { NO_AUTO_UNMAP, AUTO_UNMAP } unmap_flag;
enum { NO_ENABLE_COA, ENABLE_COA } coa_flag;

const struct dsm_config DEFAULT_DSM_CONFIG = { AUTO_UNMAP, NO_ENABLE_COA };

<more code ...>

#endif

编译时出现如下错误:

cc -g -Wall -pthread libheca.c dsm_init.c -DDEBUG    master.c   -o master
/tmp/cciBnGer.o:(.rodata+0x0): multiple definition of `DEFAULT_DSM_CONFIG'
/tmp/cckveWVO.o:(.rodata+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [master] Error 1

有什么想法吗?

最佳答案

因为每个包含在实现文件中的文件都会创建一个新的结构实例(并存储在目标文件中)。

为避免这种情况,只需在头文件中将结构声明为“extern”并在实现文件中对其进行初始化:

// In your header file: 
extern const struct dsm_config DEFAULT_DSM_CONFIG;

// In your *.c file:
const struct dsm_config DEFAULT_DSM_CONFIG = { AUTO_UNMAP, NO_ENABLE_COA };

这将解决您的问题。

关于c - 全局变量的多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14526153/

相关文章:

android - 在 ubuntu 上构建 android ADB 时出错

c++ - 规避 ld 查找

Xcode "ld: library not found [...] for architecture x86_64"

c - 如何将指针传递到 OpenCV 中的 cv BoundingRect() 中?

c - 我的程序中颠倒字符串中单词的顺序有什么问题?

c - 一个数字的最小底数,当以该底数表示时使其成为回文

c++ - 在Matlab中将固定长度的字节数组写入二进制文件

git - 生成文件错误 : Unexpected end of line seen

c - 为什么在更改源文件时 make 不重建?

c - 动态加载 (DL) 库和第一条指令