qmake没有找到一些现有的库

时间:2014-09-08 16:04:21

标签: c qt compiler-errors libraries qmake

我在Qt Creator(在Linux Ubuntu上使用qmake + GCC)将我的(纯C)项目包含两个库(不是由我制作)时遇到了问题。

我知道,要包含一个lib,可以使用this SO answer中所述的LIBS指令;我已经成功地在Linux和Windows中以这种方式插入了库。更重要的是,在同样有问题的项目中,我有两个成功插入的库。

但是现在我遇到了一个问题,包括同一个项目中的另外两个lib。其中一个库是C6RUN,两个处理器之间的对话需要,在库的文件夹中有一个/bin和一个/lib文件夹;第一个文件没有扩展名(它们不是.a或.lib),而第二个文件夹在两个子文件夹中有一组.a。另一个库位于具有/lib子文件夹的文件夹中,其中包含.lib。他们都在Eclipse的一个项目中100%工作(因此不涉及qmake / Qt Creator)。我提到了第一个库的/bin文件夹,因为在与基于Eclipse的项目相关的Makefile中,尽管不是正式的库文件,但它们引用了两个文件。

当尝试链接.pro中的两个库时,我会一如既往地做同样的事情:添加-L的路径加上-l的lib名称。当我尝试使用这两个库时,会发生错误。以下是带有动作+结果的列表(实际上我甚至试过了其他一些选项,但没有一个结果与下面显示的两个不同):

首先是lib 1

的.pro

LIBS += -L$${COMMON_PATH}/linux-devkit/c6run/lib/c6run_dsp -llibc6run

结果

error: connot find  -llibc6run

首先是lib 2

的.pro

LIBS += -L$${COMMON_PATH}/linux-devkit/c6run/lib/c6run_dsp -lc6run

结果

compiles fine.

when calling a respective method inside main.cpp / int main():

error: undefined reference of <method name>

首先是lib 3

的.pro

LIBS += -L$${COMMON_PATH}/linux-devkit/c6run/bin -lc6runlib-ar

结果

error: connot find -lc6runlib-ar

第二个lib 1

的.pro

LIBS += -L$${RE8K_REPO}/main_projects/lib_calc_dsp/lib -lcalculos

结果

error: connot find -lcalculos

第二个lib 2

的.pro

LIBS += -L$${RE8K_REPO}/main_projects/lib_calc_dsp/lib/calculos.lib

结果

compiles fine.

when calling a respective method inside main.cpp / int main():

error: undefined reference of <method name>

那么,我能错过什么?

这是另一个Makefile,用于编译在同一个项目中成功使用的库:

Calculos Makefile

#   ----------------------------------------------------------------------------
#   Name of the ARM GCC cross compiler & archiver
#   ----------------------------------------------------------------------------
ARM_TOOLCHAIN_PREFIX = arm-arago-linux-gnueabi-
ARM_TOOLCHAIN_PATH = /re8k/linux-devkit
ARM_CC := $(ARM_TOOLCHAIN_PATH)/bin/$(ARM_TOOLCHAIN_PREFIX)gcc
ARM_AR := $(ARM_TOOLCHAIN_PATH)/bin/$(ARM_TOOLCHAIN_PREFIX)ar

# Get any compiler flags from the environment
ARM_CFLAGS = $(CFLAGS)
ARM_CFLAGS += -std=gnu99 \
-Wdeclaration-after-statement -Wall -Wno-trigraphs \
-fno-strict-aliasing -fno-common -fno-omit-frame-pointer \
-c -O3
ARM_LDFLAGS = $(LDFLAGS)
ARM_LDFLAGS+=-lm -lpthread
ARM_ARFLAGS = rcs

#   ----------------------------------------------------------------------------
#   Name of the DSP C6RUN compiler & archiver
#   TI C6RunLib Frontend (if path variable provided, use it, otherwise assume 
#   the tools are in the path)
#   ----------------------------------------------------------------------------
C6RUN_TOOLCHAIN_PREFIX = c6runlib-
C6RUN_TOOLCHAIN_PATH = $(ARM_TOOLCHAIN_PATH)/c6run
C6RUN_CC := $(C6RUN_TOOLCHAIN_PATH)/bin/$(C6RUN_TOOLCHAIN_PREFIX)cc
C6RUN_AR := $(C6RUN_TOOLCHAIN_PATH)/bin/$(C6RUN_TOOLCHAIN_PREFIX)ar

C6RUN_CFLAGS = -c -mt -O3
C6RUN_ARFLAGS = rcs

#   ----------------------------------------------------------------------------
#   List of lib source files
#   ----------------------------------------------------------------------------
LIB_SRCS := calculos.c
LIB_DSP_OBJS := $(LIB_SRCS:%.c=dsp_obj/%.o)
LIB_OBJS := $(LIB_DSP_OBJS:%.o=%.lib)

all: dsp_obj/.created
    $(C6RUN_CC) $(C6RUN_CFLAGS) -o $(LIB_DSP_OBJS) $(LIB_SRCS) -DUSE_DSP;
    $(C6RUN_AR) $(C6RUN_ARFLAGS) $(LIB_OBJS) $(LIB_DSP_OBJS);

all_host: dsp_obj/.created
    gcc -c -o $(LIB_DSP_OBJS) $(LIB_SRCS);
    ar rcs $(LIB_OBJS) $(LIB_DSP_OBJS);

dsp_obj/.created:
    @mkdir -p dsp_obj
    @touch dsp_obj/.created

clean:
    rm -rf dsp_obj;

distclean: clean

其他Makefile

include Makerules.mk

export PATH := $(TGT_GCC_PATH):$(PATH)

printversions:
    @echo FWVersion: ${FIRWMARE_VERSION}
    @echo BuildTag: ${BUILDTAG}
    @echo

dev_lib:
    make -f ../build/MakeDevLib.mk -I./ all

tgt_lib:
    make -f ../build/MakeTgtLib.mk -I./ all

all: printversions tgt_lib dev_lib

install: tgt_lib dev_lib 
    @mkdir -p ../../common/lib
    cp lib/libhal* ../../common/lib
    @mkdir -p ../../common/include
    @rm ../../common/include/hal -rf
    cp src/hal ../../common/include/ -r

clean:
    make -f ../build/MakeDevLib.mk -I./ clean
    make -f ../build/MakeTgtLib.mk -I./ clean
    @rm lib -rf

Makerules.mk

BUILDTAG = $(shell svn info -r 'HEAD' | grep Revision: | egrep -o "[0-9]+") #Or: BUILDTAG = $(shell svn info -r 'HEAD' )    or:  BUILDTAG = $(shell svnversion)
FIRWMARE_VERSION = $(shell cat lib_version.txt)-$(shell date --iso)
TGT_LINUX_INCLUDE_DIR = $(shell cat ../../host_cfg/linux-tgt-include-dir.txt)

### TOOL CHAIN ###

CC=cc
AR=ar
STRIP=strip

TGT_GCC_PATH = $(shell cat ../../host_cfg/gcc-tgt-path.txt)

TGT_CC= arm-arago-linux-gnueabi-gcc
TGT_AR= arm-arago-linux-gnueabi-ar
TGT_STRIP= arm-arago-linux-gnueabi-strip
TGT_LD= arm-arago-linux-gnueabi-ld

### SOURCES ###

SOURCE_FOLDER = src

SRC_DIRS = \
    src/comm \
    src

TEST_SRC_DIRS = \
    test/mocks \
    test/comm \
    test

### PROJECT ###

TARGET = hal

### TEST FRAMEWORK ###

CPPUTEST_HOME = ../../common/CppUTest

### C FLAGS ###

ALL_CCPPFLAGS   = -Isrc -I ../../common/include -D AUTO_GEN_BUILD_TAG='"${BUILDTAG}"' -D AUTO_GEN_FIRWMARE_VERSION='"${FIRWMARE_VERSION}"' -g -fPIC -I../../kernel/packages/linux/include
ALL_CONLYFLAGS = -std=gnu99
ALL_CPPONLYFLAGS  =
TEST_CFLAGS  = -I$(CPPUTEST_HOME)/include/ -D SYSTEM_UNIT_TEST -D DEBUG
DEV_CCPPFLAGS   = -D DEV
TGT_CCPPFLAGS   = -D TGT -I $(TGT_LINUX_INCLUDE_DIR) 

### LINKER LIBS AND FLAGS ###
DEV_STATIC_LIBS      = 
TGT_STATIC_LIBS      =  
#DEV_TEST_STATIC_LIBS =  ../../common/lib/libchelper-dev-test.a 
#TGT_TEST_STATIC_LIBS =  ../../common/lib/libchelper-tgt-test.a 

DEV_SHARED_LIBS_PATH     = 
DEV_SHARED_LIBS          = -lzmq -lm -lpthread
TGT_SHARED_LIBS_PATH     = -L ../../../../sdcard_files/defaultFiles/lib
TGT_SHARED_LIBS          = -lzmq -lm -lpthread

DEV_LDFLAGS     =
TGT_LDFLAGS     =

1 个答案:

答案 0 :(得分:1)

我从未见过.lib中的Linux库。这是微软的事情。你确定calculos.lib是一个有效的Linux库吗?

您还可以使用ar命令检查您期望的对象是否在库中。例如:

ar t mylib.a

在我看来,您尝试使用的库不是在calculos的情况下不是为Linux构建的,或者没有正确导出符号以在您的应用程序中使用。这些只是一些猜测;我没有足够的信息继续下去。 :)