Как скомпилировать программу на C, не зная включаемых файлов - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть пример кода C, который я хочу адаптировать под свои нужды.До этого я пытаюсь собрать пример как есть.Код C содержит ссылку #include, и я могу найти файл .h в каталоге 'inc'.Существует также соответствующий каталог 'lib'.Я изо всех сил пытаюсь найти командную строку, мне нужно для компиляции кода.

Пока мне удалось добраться до следующего:

gcc -o amqsinqa -I/opt/mqm/inc amqsinqa.c -L/opt/mqm/lib -lcmqc

Но он 'не может найти -lcmqc'.Я посмотрел в lib и совершенно правильно нет cmqc.Как мне определить, какой параметр -l мне нужен здесь?

Код выглядит довольно просто, есть ссылка include;

#include <cmqc.h>

И сам вызов;

MQCONN(QMgrName,&Hcon,&CompCode,&CReason);

Если я опускаю опцию -l изкомандная строка, которую я получаю;

undefined reference to 'MQCONN'

Что неудивительно.Хотя MQCONN присутствует в cmqc.h.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Чтобы попытаться помочь другим, эта ссылка полезна:

В итоге:

  • -I для продукта включает в себя, которые (для Linux) обычно в /opt/mqm/inc
  • -L этопуть к библиотекам в вашем примере, которые (для Linux) обычно находятся в /opt/mqm/lib (для 32-разрядных приложений) и /opt/mqm/lib64 (для 64-разрядных приложений)
  • -l (строчная буква L)для требуемой библиотеки / библиотек:

и необходимая вам библиотека:

  • mqm - связанные с сервером приложения C (то есть -lmqm, которые связываютс libmqm.so)
  • mqic - клиентские приложения C (т. е. -lmqic, которые связаны с libmqic.so)

.. и суффиксом _rесли вы создаете как многопоточное приложение (то есть, вы также связываетесь с -lpthread, то есть предоставляете -lmqm_r или -lmqic_r, который фактически связывается с libmqm_r.so или libmqic.so)

cmqc.h это имя главного руководителяЭто файл, и есть другие заголовки cmq*.h, которые вы также можете включить дополнительно.

Если вы используете (стабилизированные) библиотеки C ++, есть другие библиотеки для включения в командную строку, но это выходит за рамки этогоответ - см. ссылки по ссылкам

0 голосов
/ 13 февраля 2019

Вам следует просмотреть параметры gcc, в частности параметр -m,

Если вы хотите создать 32-битное приложение MQ, выполните:

gcc -m32 -o amqsinqa -I/opt/mqm/inc amqsinqa.c -L/opt/mqm/lib -lmqm

Есливы хотите создать 64-битное приложение MQ, тогда вы делаете:

gcc -m64 -o amqsinqa -I/opt/mqm/inc amqsinqa.c -L/opt/mqm/lib64 -lmqm
0 голосов
/ 12 февраля 2019

Спасибо всем вышеперечисленным за руководство.Похоже, мне не хватало нескольких вещей.Это то, что я сделал;

  1. Используйте nm, чтобы определить, какой файл .so содержит то, что я хотел.Это вернул libmqm.so.
  2. Переместите это в команду -l, которая дала мне;

    gcc -o amqsinqa -I / opt / mqm / inc amqsinqa.c -L/ opt / mqm / lib -lmqm

    Но у меня осталось предупреждающее сообщение «пропуск несовместимых», за которым следует сообщение об ошибке «невозможно найти».

  3. Наиболее распространенныеОтвет Google на эту проблему был 32/64-битным несовпадением, поэтому я искал 64-битную версию, которая в конечном итоге оказалась в lib64.Итак, последняя команда компиляции:

    gcc -o amqsinqa -I / opt / mqm / inc amqsinqa.c -L / opt / mqm / lib64 -lmqm

...