qmake找不到一些现有的库 [英] qmake not finding some existing libraries

查看:192
本文介绍了qmake找不到一些现有的库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题,当包括两个库(不是由我做)到我的(纯C)项目在Qt Creator(在Linux Ubuntu使用qmake + GCC)。



我知道,为了包含一个lib,使用 LIBS http://stackoverflow.com/questions/718447/adding-external-library-into-qt-creator-project\">此答复;我已经成功地插入库在Linux和Windows这样的方式。甚至,在这个同样有问题的项目中,我有两个成功插入的库。



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



当尝试在.pro中链接这两个库时,我的做法完全一样:添加 -L 加上 -l <​​/ code>的lib名称。当我试图做那些与那两个库,错误发生。下面是具有操作+结果的列表(实际上我尝试了一些其他选项,但没有一个结果与下面两个不同):



第一个lib 1



.pro

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

em> result



 错误:connot find -llibc6run 
pre>

第一个lib 2



.pro

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



结果



 编译精细。 

当调用main.cpp / int main()中的相应方法时:

错误:undefined引用< method name>



第一个库3



.pro

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

结果


$ b b

 错误:connot find -lc6runlib-ar 



第二个lib 1



.pro



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

>结果



 错误:connot find -lcalculos 



第二个lib 2



.pro

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

结果

  

当调用main.cpp / int main()中的相应方法时:

错误:undefined引用< method name>






p>

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



Calculos Makefile



 #------------------------- -------------------------------------------------- -  
#ARM GCC交叉编译器名称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

#从环境中获取任何编译器标志
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

#----------------------------- -----------------------------------------------
#DSP的名称C6RUN编译器& archiver
#TI C6RunLib前端(如果提供了路径变量,使用它,否则假定
#工具在路径中)
#------------- -------------------------------------------------- -------------
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

#------------------------------------------- -----------------------------
#lib源文件列表
#------ -------------------------------------------------- --------------------
LIB_SRCS:= calculos.c
LIB_DSP_OBJS:= $(LIB_SRCS:%。c = dsp_obj /%。 )
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



包括Makerules.mk

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


@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 < h2>

  BUILDTAG = $(shell svn info -r'HEAD'| grep修订:| egrep -o[0-9] )#Or:BUILDTAG = $(shell svn info -r'HEAD')或: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)

###工具链###

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和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 =


解决方案

一个Linux库以 .lib 结尾。这是一个微软的事情。您确定 calculos.lib 是一个有效的Linux库吗?



您也可以使用 ar 命令查看您期望的对象是否在libs中。例如:

  ar mylib.a 

听起来我喜欢你试图使用的libs不是为在 calculos 的情况下构建的, t将符号导出正确以在您的应用程序中使用。这些只是几个猜测;我没有足够的信息继续下去。 :)


I'm having a problem when including two libraries (not made by me) into my (pure C) project in Qt Creator (using qmake + GCC on Linux Ubuntu).

I know that, to include a lib, one uses the LIBS directive as explained in this SO answer; and I have successfully inserted libraries both in Linux as well as in Windows this way. Even more, in this same problematic project I have two successfully inserted libraries.

But now I'm having a problem including this two other libs in this same project. One of this libraries is C6RUN, required for conversation between two processors, and inside the library's folder there is a /bin and a /lib folder; the first has some files with no extension (they are not a .a or .lib) while the second have, inside two child folders, a set of .a . The other library is inside a folder with a /lib subfolder with a .lib inside. Both of them are working 100% in a project in Eclipse (so no qmake/Qt Creator involved). I mentioned the /bin folder of the first library because in a Makefile related to the Eclipse-based project two of its files are referenced despite not being formally library files.

When trying to link both libraries in the .pro, I do EXACTLY the same thing as always: add the path with -L plus the name of the lib with -l. When I try to do that with those two libs, errors occur. What follows is the list with actions + results (actually I tried even some other options, but none of the results were different from the two shown below):

First lib 1

.pro

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

result

error: connot find  -llibc6run

First lib 2

.pro

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

result

compiles fine.

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

error: undefined reference of <method name>

First lib 3

.pro

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

result

error: connot find -lc6runlib-ar

Second lib 1

.pro

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

result

error: connot find -lcalculos

Second lib 2

.pro

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

result

compiles fine.

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

error: undefined reference of <method name>


So, what could I be missing?

Here is another Makefile that is used to compile a library that is successfully used in the same project:

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

Other 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     =

解决方案

I've never seen a Linux library end in .lib. That is a Microsoft thing. Are you sure calculos.lib is a valid Linux lib?

You can also check using the ar command to see if the objects you expect are in the libs. For example:

ar t mylib.a

It sounds to me like the libs you are trying to use were either not built for Linux in the case of calculos or don't have the symbols exported properly to be used in your application. These are just a few guesses; I don't have enough information to go on. :)

这篇关于qmake找不到一些现有的库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆