2016-09-11 3 views
0

Да, я действительно хочу получить эту ошибку. Я использую MSVC (командная строка). Я хотел бы иметь .lib, который потребует определения внешнего символа, который связан с ним. Я должен понять, что-то неправильно о статическом связывании, потому что мне мой подход кажется законен:Как получить нерешенные внешние ошибки в lib?

У меня есть файл, который выглядит примерно так:

extern INFO_BLOCK user_setup; 

int 
crtInit() 
{ 
    SetInfoBlock(&user_setup); 
    return 0; 
} 

, когда я пытаюсь использовать .obj этого файла в компиляция с основным модулем cl main.c file.obj Это говорит о неразрешенных внешних. Это желаемое поведение. Тем не менее, когда я пакет file.obj с lib file.obj даже с использованием/включают: user_data (который, честно говоря, я не доверяю как никакой пользы в этом случае)

используя .lib с cl main.c /link file.lib не создает недостающие внешние и это проблема. Мне нужен программист для определения этого символа. Удаляется ли extern после того, как вы поместите свой .obj в .lib? Где я ошибаюсь?

+1

Попробуйте вызвать 'crtInit'. – immibis

ответ

2

Если main.c не содержит никаких ссылок на crtInit нет никаких оснований для линкера, чтобы вытащить эту функцию в генерируемой двоичном - Таким образом, он не будет «видеть» неразрешенную ссылку на user_setup вообще.

При упоминании файла объект к компоновщик, сила его включить объектный файл в двоичный файл, независимо от того, нужен ли он в программе или нет.

Противоположность, что, когда вы упомянуть библиотеки линкера, он будет использовать только библиотеку, чтобы разрешить неразрешенные ссылки у вас уже есть в этой точке с объектными файлами, которые он вытягивает в из этой библиотеки. В случае, если до этого момента ничего не разрешено (или не удовлетворено каким-либо символом в библиотеке), компоновщик вообще ничего не будет использовать из библиотеки.

Вышесказанное также является причиной того, что многие линкеры немного придирчивы к порядку библиотек при связывании (обычно от определенного к родовому - или «пользователю» - к «системе»), поскольку линкеры обычно имеют один проход и будут только вытащить то, что они «видят» в этой конкретной точке процесса связывания.

Смежные вопросы