我在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名称。当我尝试使用这两个库时,会发生错误。以下是带有动作+结果的列表(实际上我甚至试过了其他一些选项,但没有一个结果与下面显示的两个不同):
的.pro
LIBS += -L$${COMMON_PATH}/linux-devkit/c6run/lib/c6run_dsp -llibc6run
结果
error: connot find -llibc6run
的.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>
的.pro
LIBS += -L$${COMMON_PATH}/linux-devkit/c6run/bin -lc6runlib-ar
结果
error: connot find -lc6runlib-ar
的.pro
LIBS += -L$${RE8K_REPO}/main_projects/lib_calc_dsp/lib -lcalculos
结果
error: connot find -lcalculos
的.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,用于编译在同一个项目中成功使用的库:
# ----------------------------------------------------------------------------
# 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
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
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 =
答案 0 :(得分:1)
我从未见过.lib
中的Linux库。这是微软的事情。你确定calculos.lib
是一个有效的Linux库吗?
您还可以使用ar
命令检查您期望的对象是否在库中。例如:
ar t mylib.a
在我看来,您尝试使用的库不是在calculos
的情况下不是为Linux构建的,或者没有正确导出符号以在您的应用程序中使用。这些只是一些猜测;我没有足够的信息继续下去。 :)