Компиляция исходного файла, который зависит от нескольких деревьев исходного кода - PullRequest
1 голос
/ 28 июля 2011

Как мне скомпилировать исходный файл C, который # включает заголовочные файлы из каждого из двух независимых исходных деревьев? Каждое исходное дерево имеет свой собственный набор make-файлов, и исходные деревья полностью независимы друг от друга.

Я пишу плагин Wireshark, который интерпретирует пакеты определенного сетевого протокола. Чтобы скомпилировать плагин, компилятору необходимо разрешить символы в исходном дереве Wireshark. Однако для того, чтобы плагин действительно интерпретировал содержимое сетевых пакетов, когда Wireshark предоставляет ему байтовый массив, плагин также должен включать определения структур данных и процедур RPC XDR из совершенно отдельного дерева исходных текстов. Поэтому компилятору также необходимо разрешить символы как для Wireshark, так и для совершенно отдельного дерева исходных текстов, содержащего эти файлы.

Есть ли простой способ сделать это? Будем очень благодарны за любые предложения.

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

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

Для компиляции с tree1 и tree2 используйте директиву -I include для gcc.gcc -c -I / some / include / for / tree1 -I / some / include / for / tree2 input.c -o output.o

для связи с двумя деревьями, создания файлов .so или .la(статические или динамические библиотеки) из каждого дерева.Назовите их tree1.la tree2.la.поместите их в / path / to / tree1 / libs и / path / to / tree2 / libs

, затем линк

gcc -o prog -ltree1 -ltree2 -L / path / to / tree1/ libs -L / path / to / tree2 / libs

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

0 голосов
/ 28 июля 2011

Если вы используете gcc / g ++

Используйте флаги -I для включения необходимых заголовочных файлов для компиляции.

например:

g++ -I<includepath1> -I<includepath2> ... -c somefile.cpp -o somefile.o

Используйте флаг -L для связи с библиотеками. например:

g++ -o pluginname.so somefile.o somefile2.o somefile3.o -L <libpath1> -l<libname1> -L <libpath2> -l <libname2> <fullpath to .a file for statically linking>

В Windows подход аналогичен, отличается только номенклатура, файл .dll вместо файлов .so и .lib вместо файлов .a.

...