如何在不知道包含文件的情况下编译C程序

时间:2019-02-12 11:07:48

标签: c ibm-mq

我有一些示例C代码,我希望这些代码可以适应我的需要。在此之前,我尝试按原样编译示例。 C代码包含#include参考,我可以在'inc'目录中找到.h文件。还有一个对应的“ lib”目录。我正在努力寻找需要编译代码的命令行。

到目前为止,我已经设法了解以下内容;

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

但是它“找不到-lcmqc”。我已经在lib中查看了,很正确地没有cmqc。如何确定这里需要的-l选项?

代码看起来很简单,有包含引用;

#include <cmqc.h>

通话本身;

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

如果我在命令行中省略了-l选项,那么我会得到;

undefined reference to 'MQCONN'

这并不奇怪。但是,MQCONN存在于cmqc.h中。

3 个答案:

答案 0 :(得分:4)

要尝试帮助他人,此参考很有用:

总结:

  • -I用于产品包括,通常在/opt/mqm/inc中使用(对于Linux)
  • -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.solibmqic.so链接)

cmqc.h是主头文件的名称,还可以选择包含其他cmq*.h头文件。

如果您使用的是(稳定的)C ++库,则命令行中将包含其他库,但这不在此答案的范围内-请参阅引用的链接

答案 1 :(得分:1)

感谢上述所有指导。好像我错过了一些东西。这就是我所做的;

  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

答案 2 :(得分:0)

您应该查看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