компиляция и компоновка gcc - PullRequest
0 голосов
/ 24 августа 2018

Я создал разделяемую библиотеку таким образом

gcc -I/home/lib 'pkg-config --cflags gtk+-2.0 libxml-2.0' -shared -fPIC -Wl,--export-dynamic file1.c file2.c -o lib.so

, она работает, и созданная библиотека также работает для того, что мне нужно.Что я хочу знать, так это где компиляция и компоновка находятся в этой командной строке, поэтому, пожалуйста, объясните мне и расскажите, как разделить их на две разные команды, чтобы лучше понять.Мне нужно понять это, потому что я не могу не объяснить, почему эта библиотека работает, даже если она должна быть связана с другой, которую я никогда не связывал с ней.

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Ваша команда компилируется и связывается за один вызов.

Вы можете разделить команду на команды компиляции и компоновки:

gcc -c -o file1.o -Wall -Wextra -Werror -I/home/lib $(pkg-config --cflags gtk+-2.0 libxml-2.0) -fPIC file1.c
gcc -c -o file2.o -Wall -Wextra -Werror -I/home/lib $(pkg-config --cflags gtk+-2.0 libxml-2.0) -fPIC file2.c
gcc -shared -o lib.so file1.o file2.o
0 голосов
/ 24 августа 2018

GCC использует расширения в именах файлов, чтобы определить, к какому типу они относятся и что с ними делать.Таким образом, тот факт, что вы перечислили некоторые имена, заканчивающиеся на «.c», говорит GCC о необходимости компилировать их в виде кода C.Если бы вы указали только имена, заканчивающиеся на «.o», GCC обработал бы их как объектные файлы и не скомпилировал бы их.

После компиляции GCC по умолчанию связывается, чтобы сделать исполняемый файл.Переключатель «-shared» указывает вместо этого создать общую библиотеку.

Чтобы компилировать только без связывания, вы можете использовать переключатель «-c» и удалить переключатель «-shared», а также удалить всеаргументов команды или переключателей, которые используются только для компоновки («-Wl, - export-dynamic» - один, и я не знаю, будет ли этот pkg-config генерировать какие-либо параметры ссылки).Также удалите или измените «-o lib.so», так как это задает имя, используемое для выходного файла, и это не то, что вы хотите для объектных файлов, которые получаются только в результате компиляции.

Только для ссылкибез компиляции вы бы просто перечислили объектные файлы вместо исходных файлов и удалили параметры, влияющие на компиляцию («-I / home / lib», «-fPIC» и любые, созданные pkg-config).

0 голосов
/ 24 августа 2018

Опция gcc -c предназначена только для компиляции. Однако я не уверен, что вы этого хотите.

...