qmake找不到一些现有的库 [英] qmake not finding some existing libraries
问题描述
我有一个问题,当包括两个库(不是由我做)到我的(纯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 surecalculos.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屋!