Tôi có sau "hằng số" tiêu đề:Linking vấn đề với "nhiều định nghĩa về" lỗi biên dịch
/* constants.h */
#ifdef __cplusplus
extern "C" {
#endif
#pragma once
#ifndef CONSTANTS_H
#define CONSTANTS_H
const char * kFoo = "foo";
const char * kBar = "bar";
#endif
#ifdef __cplusplus
}
#endif
Tôi #include
-ing tiêu đề này trong các tập tin X.c
và Y.c
.
Lưu ý rằng tôi là không phải bao gồm điều này trong X.h
hoặc Y.h
.
Các tệp X.c
và Y.c
được biên dịch thành các tệp đối tượng được lưu trữ vào thư viện tĩnh được gọi là libXY.a
.
Khi tôi bao gồm X.h
và Y.h
trong Z.h
, và khi tôi liên kết đến libXY.a
, tôi không thể biên dịch Z.c
không có lỗi:
/* Z.h */
#include "X.h"
#include "Y.h"
tôi nhận được lỗi biên dịch sau khi cố gắng biên dịch Z.c
:
/path/to/libXY.a(X.o):(.data+0x0): multiple definition of `kFoo`
/path/to/libXY.a(Y.o):(.data+0x0): first defined here
/path/to/libXY.a(X.o):(.data+0x8): multiple definition of `kBar`
/path/to/libXY.a(Y.o):(.data+0x8): first defined here
Tôi đã thử đặt kFoo
và kBar
thành extern
, nhưng điều đó không giúp được gì.
Làm cách nào để giải quyết nhiều định nghĩa, khi tôi chỉ bao gồm các hằng số một lần (thông qua bảo vệ tiêu đề #ifndef CONSTANTS_H
)?
Có lẽ không phải là vấn đề ngay lập tức (không chắc chắn), nhưng bạn nên loại bỏ bogus '#pragma once' và đặt các bộ bao gồm nhiều sự bao gồm thích hợp vào tiêu đề của bạn. Định dạng chuẩn là '#ifndef MYHEADER_H #define MYHEADER_H .... # endif' –