我们一直在 Linux (gcc) 和 Windows (Visual Studio) 上编译一个库,正如预期的那样,发现在两个平台上进行干净编译所需的差异很小,但没有显着差异。
今天,我将 gcc 编译器标志更改为使用-fPIC
(以启用共享库)。当我们测试将程序与库链接时,我们开始收到错误(第一次),其中有 undefined reference
2 个静态常量在头文件中声明和初始化(但不在 .cpp 文件中)。
我发现this StackOverflow answer似乎解决了这个问题,解释说,即使static const
在头文件中初始化,它仍然需要在代码文件中定义。并且进行该更改确实消除了 gcc 链接器错误。
然而,Visual Studio 不喜欢这种变化,并产生了multiple definition
错误。我们必须包装需要预处理器条件的定义,以使 Visual Studio 能够干净地编译。
有人可以告诉我这里有什么区别吗?(代码摘录如下。)
味精.h
class msg
{
public:
static const int EMPTY_INT_VALUE = INT_MAX;
static const char EMPTY_STRING_VALUE = '\002';
// can't define value in header, defined in cpp file
static const double EMPTY_DOUBLE_VALUE;
...
}
味精.cpp
#include "msg.h"
const double msg::EMPTY_DOUBLE_VALUE(DBL_MAX);
#ifndef _WIN32
// g++ requires these definitions, vs 2010 doesn't like them
const int msg::EMPTY_INT_VALUE;
const char msg::EMPTY_STRING_VALUE;
#endif