在Linux中链接库与c程序的问题

时间:2015-10-17 22:35:42

标签: c linux static-libraries beagleboneblack

我想从Bealgebone到4Dsystems显示器运行串行命令。因此,我将找到here的c库复制到一个目录中并创建了一个测试程序main.c:

#include "Picaso_const4D.h" 
#include "Picaso_Serial_4DLibrary.h"

int main(int argc,char *argv[])
{
    OpenComm("/dev/ttyUSB0", B115200);  // Matches with the display "Comms" rate
    gfx_BGcolour(0xFFFF);
    gfx_Cls();
    gfx_CircleFilled(120,160,80,BLUE);
    while (1) {}
}

现在当我gcc -o main main.c说出

  

main.c:2:37:致命错误:Picaso_Serial_4DLibrary.h:没有此类文件或   目录

所以我尝试链接它:

gcc main.c  -L. -lPICASO_SERIAL_4DLIBRARY

给了我同样的错误。然后我尝试创建一个静态库:

gcc -Wall -g -c -o PICASO_SERIAL_4DLIBRARY PICASO_SERIAL_4DLIBRARY.C

给了我这个:

  

PICASO_SERIAL_4DLIBRARY.C:1:21:致命错误:windows.h:没有这样的文件   或目录编译终止。

我做错了什么? git页面清楚地说这个库是为那些不运行windows的人创建的。

提前致谢!

2 个答案:

答案 0 :(得分:3)

您没有收到链接器错误;您收到预处理器错误。具体来说,您的预处理器无法找到Picaso_Serial_4DLibrary.h。确保它包含在您的包含路径中;您可以使用gcc的-I参数将目录添加到包含路径。

答案 1 :(得分:3)

你有两个问题。首先是无法找到的picaso_whatever.h文件。你用你添加的-I修正了它。但是,现在,picaso.h想要windows.h

你在做什么? WinX或BSD / Linux?

如果您正在使用WinX进行编译,则需要为visual studio安装“platform sdk”。

如果您正在使用mingw或cygwin,则需要执行其他操作。

如果在WinX上,请转到C:目录。执行find . -type f -name windows.h并为包含目录添加-I。

如果在Linux下,请在源树顶层重复查找。否则,您可能需要安装一些兼容性交叉构建库。

或者,你必须找到拥有它的WinX,因为Picaso显然包含它。您可以尝试为其中的一个或多个#include评论,看看事情是好还是坏。

如果找不到真实的,请创建一个空的windows.h并向其添加-I,看看有多糟糕[或好]。

您可能需要mingw交叉编译器。见https://forums.wxwidgets.org/viewtopic.php?t=7729

更新:

好的......哇......你走在正确的轨道上并且关闭了,但这就是,IMO,丑陋的WinX东西。

Picaso的主要需求是获得一个串行通信端口连接,因此需要从windows.h中获得最小的功能。它需要WORD,DWORD等的基本样板定义

mingw或cygwin将提供自己的windows.h副本。这些是“洁净室”重新实现,因此没有版权问题。

mingw是一个编译/构建工具的集合,允许您使用gcc / ld / make构建实用程序。

cygwin更像是:我想要一个类似于BSD / Linux的类似shell的环境。你得到bash,ls,gcc,tar,以及你想要的任何GNU实用程序。

警告:我使用cygwin,但从未使用过mingw。 windows.h的mingw版本[以及它下面包含的一组.h文件]是开源的,可以被其他项目重用(例如cygwin,wine)。

在Linux下,wine(windows模拟器)是一个程序/套件,它试图让你在Linux下运行WinX二进制文件(例如wine mywinpgm)。

我git克隆了Picaso库,经过一些小小的调整后,我可以在将它指向wine的windows.h版本之后将其编译好。

Picaso的OpenComm正在进行CreateFile [win32 API调用]。所以,你可能需要cygwin。你正在打开/ dev / ttyUSB0。 / dev / *暗示cygwin。但是,/ dev / ttyUSB0是一个类似Linux的名称。您可能需要一些WinX风格的名称,如“COM:”或其他。在cygwin终端[给你一个bash提示]下,做ls / dev并看看有什么可用。

你可以从http://cygwin.com/获得cygwin如果你有一个64位系统,一定要使用64位版本的安装程序:setup-x86_64.exe它是半图形的,需要两个目录,一个用于“根”FS和一个用于存储包。在我的系统上,我使用C:\ cygwin64和C:\ cygwin64_packages - YMMV。

请注意,安装程序默认不会安装gcc。您可以[图形]选择要安装的软件包。您可能还需要一些“开发”软件包。它们具有非开发人员不需要的库和.h文件。正如文档所述,您可以根据需要随时重新运行安装程序。您可以添加您忘记指定的软件包,甚至可以删除您不再需要的软件包。

请记住,您需要适当调整makefile -I和/或-L选项。此外,在构建picaso库时,gcc会产生大量关于“大整数”溢出的警告。代码正在做:

#define control_code -279
unsigned char buf[2];
buf[0] = control_code >> 8;
buf[1] = control_code;

代码没问题,警告是正确的[因为代码很草率]。如果代码完成了:

#define control_code -279
unsigned char buf[2];
buf[0] = (unsigned) control_code >> 8;
buf[1] = (unsigned) control_code;
它可能会保持沉默。在Makefile中使用-Wno-overflow来消除警告,而不是编辑50行左右的行