Как правило, статические библиотеки не генерируют объектные файлы. Что вы делаете, это создаете объектные файлы и помещаете их в библиотеку, тогда компоновщик будет искать объектные файлы в этих библиотеках.
Я объясню с точки зрения командной строки UNIXy, поскольку это проще для понимания (я понятия не имею, что делает махинации VS, прежде чем делать основные вещи).
Пример командной строки для создания исполняемого файла:
gcc -c -o prog.o prog.c
gcc -o prog prog.o -L/libdir -lstdc
Первая строка просто создает объектный файл из вашего C
файла. Во второй строке создается исполняемый файл путем объединения объектных файлов, как правило, в соответствии с набором правил, подобным следующему:
- Все файлы
.o
, перечисленные в явном виде, связаны между собой.
- Как только это будет сделано, вы будете искать в библиотеках другие объекты, которые удовлетворяют указанным, но не определенным символам.
Например, скажем, ваш prog.c
содержал строку printf("hello\n");
. Это приведет к тому, что ваш файл prog.o
содержит ссылку на printf
, которая еще не удовлетворена.
Компоновщик будет искать в указанных вами библиотеках до тех пор, пока не будет удовлетворен этой ссылке. В этом случае он будет искать все файлы вида /libdir/libstdc.ext
, где:
/libdir
из вашей опции -L
(путь для поиска библиотек в).
/lib
является константой.
stdc
- это имя библиотеки для поиска (от -l
).
ext
- это одно или несколько расширений (.a, .so, .sl
и т. Д.).
Как только символ найден, этот объектный файл связывается для его разрешения. Это может привести к появлению больше неудовлетворенных символов, таких как /libdir/libstdc.a(printf.o)
со ссылкой на /libdir/libstdc.a(putch.o)
.
Ваша конкретная проблема может быть вызвана тем, что вы пытаетесь связать объектный файл напрямую, а не искать в библиотеках. В VS должны быть опции проекта для указания объектных файлов, путей поиска библиотек и имен библиотек (я не уверен в этом для последних версий, но знаю, что более ранние версии MSVC делали).