这与这个问题类似(但不同)。
以下是一些简单的测试代码,用于说明我在使用Sun CC时发现的一些奇怪问题:
//---------------main.cpp
#include "wtc.hpp"
int main(int, char**)
{
testy t;
t.lame(99);
return 0;
}
//--------------wtc.hpp
#ifndef WTC_HPP_INCLUDED
#define WTC_HPP_INCLUDED
class testy
{
public:
void lame(int );
};
#endif
//---------------wtc.cpp
#include <iostream>
#include "wtc.hpp"
void testy::lame(const int a)
{
std::cout << "I was passed " << a << "\n";
}
//---------------makefile
#CXX=CC
CXX =g++
#CXXFLAGS= -g
CXXFLAGS= -g3 -Wall -Werror
OBJECTS=$(patsubst %.cpp,%.o,$(wildcard *.cpp))
all : $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $^
.PHONY: clean
clean :
rm *.o
当使用g++编译时,它会编译、链接并在运行时按预期执行。您还可以在testy::lame()中添加++a;,编译器将抱怨更改只读变量(应该如此)。
然而,当我使用CC编译时,我得到以下链接器错误:
CC -g -c -o main.o main.cpp
CC -g -c -o wtc.o wtc.cpp
CC -g -o all main.o wtc.o
Undefined first referenced
symbol in file
void testy::lame(int) main.o
ld: fatal: Symbol referencing errors. No output written to all
make: *** [all] Error 1
通过使用nm和C++filt检查目标代码,我发现g++版本创建了一个testy::lame(int)符号,而CC创建了testy::lame(const int),因此出现了链接错误。
我在Stroustrup的书中查找了这个技术,但没有找到提到它(这并不意味着它不存在!);所以这真的是一个编译器bug,还是一个在Solaris之外的任何地方都可以工作的hack?