2014-09-13 3 views
2

Мой тест имеет два файла:Неопределенная ссылка вопрос с минимальным "экстерном" тест использование случае

a.cc:

#include <iostream> 

using namespace std; 

const string program_name("myprog"); 

b.cc:

#include <iostream> 

using namespace std; 

extern const string program_name; 

int main(int argc, char **argv) { 
    cout << program_name << endl; 

    return 0; 
} 

При компиляции , Я получаю следующий результат:

$ g++ -c a.cc -o a.o -std=c++11 -O2 
$ g++ -c b.cc -o b.o -std=c++11 -O2 
$ g++ a.o b.o -o case 
b.o: In function `main': 
b.cc:(.text.startup+0x7): undefined reference to `program_name' 
collect2: error: ld returned 1 exit status 

В a.o, у меня есть следующий символ:

0000000000000018 b _ZL12program_name 

И в b.o:

  U program_name 

вопрос: почему я снимаю себе в ногу здесь?

Примечание: г ++ 4.9.1

ответ

2

Хорошо один. Это все из-за ключевого слова const.

Это уже на StackOverflow: [click]

Процитирую:

Это потому, что сопзЬ означает внутреннюю связь по умолчанию, так что ваш «определение» не видно снаружи ЕП, где он появляется ,

+0

Спасибо! Я решил это, добавив «extern» к определению. – ivarec